обнаружение c # usb - PullRequest
       3

обнаружение c # usb

5 голосов
/ 31 марта 2011

У нас есть несколько процессов в текущем приложении. Один процесс занимается обнаружением и удалением USB-загрузчика. Код для обработки обнаружения и удаления, как показано ниже.

protected override void WndProc(ref Message m)
        {
            switch (m.Msg)
            {
                case Win32.WM_DEVICECHANGE: OnDeviceChange(ref m);
                    break;
            }
            base.WndProc(ref m);
        }

private void OnDeviceChange(ref Message msg)
        {
            int wParam = (int)msg.WParam;
            Win32.DEV_BROADCAST_VOLUME dbVol = new Win32.DEV_BROADCAST_VOLUME();
            Win32.DEV_BROADCAST_HDR msgDevHeader = new Win32.DEV_BROADCAST_HDR();
            const int DBT_DEVTYP_VOLUME = 0x00000002;
            string loaderUpdates;

            switch (wParam)
            {
                case Win32.DBT_DEVICEARRIVAL:
                    int devType = Marshal.ReadInt32(msg.LParam, 4);

                    if (devType == DBT_DEVTYP_VOLUME)
                    {
                    }
                    break;

                case Win32.DBT_DEVICEREMOVECOMPLETE:

                                     break;
            }
        }

Когда я запускаю процесс, который обрабатывает загрузчик USB в режиме отладки в среде Visual Studio, он правильно определяет USB. Но я все равно получаю несколько сообщений. получает сообщение со значением wparam как «7» 3 раза, а затем получает значение wparam как «32768 (0x8000 / DBT_DEVICEARRIVAL)». Это нормально?

Когда я запускаю весь другой процесс вместе с процессом, который обнаруживает USB, кажется, что всегда будет получено только сообщение со значением wparam как «7». получает сообщение с wparam как "7" 5 раз. Нет сообщения со значениями wparam как "(0x8000 / DBT_DEVICEARRIVAL)". в чем может быть проблема?

Цените любые материалы / решения.

С уважением Раджу

1 Ответ

3 голосов
/ 31 марта 2011

Из того, что я видел, это нормально.Здесь я сталкиваюсь с точно такой же проблемой.

Две вещи, которые вы можете сделать - установить переменную для DateTime.Now, а затем проверить следующее прибытие, чтобы увидеть, меньше ли разница во времени между прибывающими, чем x секунд отв последний раз было событие (в основном сохраняйте время с момента последней обработки поступления)

или

Вы можете сохранить список дисков, и если событие обрабатывает то же устройство, что и выесть, тогда вы игнорируете это.

Но да, поскольку USB-устройства часто представляются системе как несколько устройств, она имеет тенденцию отправлять несколько вставок устройств.

Еще одна вещь, к которой я привыкОбойти это можно с помощью событий WMI, с помощью наблюдателя для обнаружения событий логического хранения (__InstanceCreation с целью Win32_LogicalDisk)

    private void startMonitor()
    {
        while (serviceStarted)
        {
            ManagementEventWatcher watcher = new ManagementEventWatcher();

            WqlEventQuery query = new WqlEventQuery("SELECT * FROM __InstanceCreationEvent WITHIN 5 WHERE TargetInstance ISA 'Win32_LogicalDisk'");

            watcher.EventArrived += new EventArrivedEventHandler(watcher_EventArrived);
            watcher.Query = query;
            watcher.Start();
            watcher.WaitForNextEvent();
        }
        Thread.CurrentThread.Abort();
    }

С обработчиком EventArrived ...

    private void watcher_EventArrived(object obj, EventArrivedEventArgs e)
    {
            var newEvent = e.NewEvent;

            ManagementBaseObject targetInstance = (ManagementBaseObject)newEvent.GetPropertyValue("TargetInstance");

            string drivename = targetInstance.GetPropertyValue("Name").ToString();

Drivename заканчивается буквой диска, такой как D: или что-то еще ...

Недостатком является то, что приложение должно работать с корректнойt привилегий для локальной области WMI, и это немного более интенсивно, чем пассивная обработка оконных сообщений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...