powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Перехват сообщений через сервис.
7 сообщений из 7, страница 1 из 1
Перехват сообщений через сервис.
    #38549060
Students
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет всем!

Я прочитал интересную статью
http://dotnetshack.blogspot.ru/2010/06/windows-wpf-wndproc.html

и написал 2 проги - "вставка/выемка флэшки" для WinForms (через WndProc) и для WPF (через OnSourceInitialized и HwndSource.AddHook) .

Вопрос - каким образом можно отследить вставку/выемку флэшки через сервис, т.е. не используя WndProc и HwndSource.AddHook
...
Рейтинг: 0 / 0
Перехват сообщений через сервис.
    #38549109
Students
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Перехват сообщений через сервис.
    #38549127
Students
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не то нашёл.

На некоторых форумах пишут, что нельзя никак, т.к. WndProc, обрабатывающий сообщения Windows можно вызвать только в WinForms.
...
Рейтинг: 0 / 0
Перехват сообщений через сервис.
    #38549301
petalvik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Students,

можно с помощью WMI отслеживать подключение/отключение флэшек.
...
Рейтинг: 0 / 0
Перехват сообщений через сервис.
    #38549590
Фотография Замглавврача
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petalvikможно с помощью WMI отслеживать подключение/отключение флэшек.

WMI глючит. Особенно с дискетами, если флопик стоит - начинает им непрерывно стучать. Я 6 лет назад писал фотокиоск для одной конторы и сделал тупо опрос дисков по таймеру. Ниже пример.

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Windows.Threading;
using IO = System.IO;

namespace FileSystem
{

  public class DevicesWatcher : DispatcherObject
  {

    #region DeviceWatcher creation

    DevicesWatcher() { }

    delegate DevicesWatcherImpl GetWatcherInstanceDelegate();
    static GetWatcherInstanceDelegate GetWatcherInstance = delegate() { return Singleton<DevicesWatcherImpl>.Instance; };

    public static DevicesWatcher Create(IDevicesView view)
    {
      Dispatcher disp = DispatcherBuilder.BuildDispatcher();
      DevicesWatcherImpl watcher
        = (DevicesWatcherImpl)disp.Invoke(DispatcherPriority.Normal, GetWatcherInstance);
      watcher.AttachToView(view);
      return watcher;
    }

    #endregion

    class DevicesWatcherImpl : DevicesWatcher
    {

      public DevicesWatcherImpl()
      {
        Thread.CurrentThread.IsBackground = true;

        lock (syncRoot)
        if (!started)
          Dispatcher.BeginInvoke(DispatcherPriority.Normal, new ThreadStart(Run));
      }

      public void AttachToView(IDevicesView view)
      {
        lock (syncRoot)
        {
          deviceAttached += new EventHandler<DeviceEventArgs>(view.AttachDevice);
          deviceDetached += new EventHandler<DeviceEventArgs>(view.DetachDevice);

          EventHandler<DeviceEventArgs> viewAttachDevice = new EventHandler<DeviceEventArgs>(view.AttachDevice);

          foreach (string device in lastKnowDevices)
            Dispatcher.BeginInvoke(DispatcherPriority.Send, viewAttachDevice, new DeviceEventArgs(device));
        }
      }

      void Run()
      {
        lock (syncRoot)
          if (!started)
            started = true;
          else
            return;

        while (true)
        {
          Thread.Sleep(timeout);
          lock (syncRoot)
          try
          {
            // Определяем текущее состояние дисковой системы
            List<string> currentDevices = (from drive in System.IO.DriveInfo.GetDrives()
                                           where drive.IsReady
                                           && !unusedDevices.Contains(drive.Name.Substring(0, 2))
                                           && watchedTypes.Contains(drive.DriveType)
                                           select drive.Name.Substring(0, 2)).ToList<string>();
            // Для каждого добавленного устройства вызываем обработчки
            foreach (string device in lastKnowDevices)
              if (!currentDevices.Contains(device))
                deviceDetached(this, new DeviceEventArgs(device));
            // Для каждого добавленного устройства вызываем обработчик
            foreach (string device in currentDevices)
              if (!lastKnowDevices.Contains(device))
                deviceAttached(this, new DeviceEventArgs(device));
            // Сохраняем текущее состояние дисковой подсистемы
            lastKnowDevices = currentDevices;
          } catch { }
        }
      }

      event EventHandler<DeviceEventArgs> deviceAttached = delegate { };
      event EventHandler<DeviceEventArgs> deviceDetached = delegate { };

      // Список неопрашиваемых устройств
      List<string> unusedDevices = new List<string>() { @"A:" };
      // Список опрашиваемых типов устройств
      List<IO.DriveType> watchedTypes = new List<IO.DriveType>() { IO.DriveType.CDRom, IO.DriveType.Removable };
      // Данные последнего опроса состояния дисковой подсистемы
      List<string> lastKnowDevices = new List<string>();
      // Время между опросами состояния
      TimeSpan timeout = new TimeSpan(0, 0, 0, 1);
      // Объект синхронизации доступа к списку устройств последнего опроса
      object syncRoot = new object();
      // Триггер состояния
      bool started = false;

    }

  }
}
...
Рейтинг: 0 / 0
Перехват сообщений через сервис.
    #38549658
Students
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ясно, спасибо.

наверное, можно и по таймеру вызывать. предложу шефу просто каждую минуту проверять - нет ли новой флешки и всё.
...
Рейтинг: 0 / 0
Перехват сообщений через сервис.
    #38550005
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
StudentsНа некоторых форумах пишут, что нельзя никак, т.к. WndProc, обрабатывающий сообщения Windows можно вызвать только в WinForms.
врут, Windows API можно использовать и без WinForms
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Перехват сообщений через сервис.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]