Не срабатывает обнаружение USB устройства - C#

Узнай цену своей работы

Формулировка задачи:

Написал программу, которая определяет подключение флешки и далее работает с ней. Основное окно свернуто в трей(при помощи notifyicon). Так вот, все нормально работает , но попадаются некоторые WIN XP на которых программа не работает, не получает сообщение о подключении устройства. Но если из трея ее развернуть, то все работает корректно. В чем может быть проблема? Определяю подключение юсб устрйоства так :
private const int DBT_DEVICEARRIVAL = 0x8000;
 
        protected override void WndProc(ref Message m)
        {
 
             base.WndProc(ref m);
            
             if (m.Msg == WM_DEVICECHANGE)
             {
                 switch ((int)m.WParam)
                 {
                     case DBT_DEVICEARRIVAL:  // Вот сюда на некоторых ОС не заходит.(int)m.WParam всегда равно 7.
                         {
                           DEV_BROADCAST_HDR dbhARRIVAL = (DEV_BROADCAST_HDR)Marshal.PtrToStructure(m.LParam, typeof(DEV_BROADCAST_HDR));
                         if (dbhARRIVAL.dbch_devicetype == DBT_DEVTYP_VOLUME)
                         {
                             DEV_BROADCAST_VOLUME dbv = (DEV_BROADCAST_VOLUME)Marshal.PtrToStructure(m.LParam, typeof(DEV_BROADCAST_VOLUME));
 
                             MessageBox("Устройство обнаружено");
                         }
                                             
                             break;
                         }
                 }
             }
            
        }

Решение задачи: «Не срабатывает обнаружение USB устройства»

textual
Листинг программы
[DllImport("user32.dll", SetLastError = true)]
private static extern IntPtr RegisterDeviceNotification(IntPtr hwnd, DeviceBroadcastInterface oInterface, uint nFlags);
private const int DEVTYP_DEVICEINTERFACE = 0x05;
private const int DEVICE_NOTIFY_ALL_INTERFACE_CLASSES = 0x4;
 
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode, Pack = 1)]
        public class DeviceBroadcastInterface
        {
            public int Size;
            public int DeviceType;
            public int Reserved;
            public Guid ClassGuid;
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
            public string Name;
        }
 
public static IntPtr RegisterForUsbEvents(IntPtr hWnd)
        {
            var oInterfaceIn = new DeviceBroadcastInterface();
            oInterfaceIn.Size = Marshal.SizeOf(oInterfaceIn);
            oInterfaceIn.ClassGuid = Guid.Empty;
            oInterfaceIn.DeviceType = DEVTYP_DEVICEINTERFACE;
            oInterfaceIn.Reserved = 0;
            return RegisterDeviceNotification(hWnd, oInterfaceIn, DEVICE_NOTIFY_ALL_INTERFACE_CLASSES);
        }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 3.833 из 5
Похожие ответы