WndProc пропускаются сообщения WM_DEVICECHANGE
От: Alex74 Россия  
Дата: 20.10.20 15:28
Оценка:
Здравствуйте.
Есть прибор, у которого несколько блоков, каждый подключается по USB. эмуляция COM-портов.
Пока портов было не больше двух — все работало нормально.
С появлением третьего (а в будущем, может и 4-й и 5-й появятся) появилась проблема.
при включении прибора, "одновременно" добавляются три COM порта COM3, COM6 и COM12.
По факту, при включении прибора, программа видит подключение только COM3 и COM12 (DeviceManager — видит появление всех).
а при отключении — видит только отключение COM6 и COM12.

 protected override void WndProc(ref Message m)
        {
            if (m.Msg == WM_DEVICECHANGE)
            {
                switch ((int)m.WParam)
                {
                    case DBT_DEVNODES_CHANGED:
                        break;
                    case DBT_DEVICEARRIVAL:
                        pHdr = (DEV_BROADCAST_HDR)Marshal.PtrToStructure(m.LParam, typeof(DEV_BROADCAST_HDR));
                        if (pHdr.dbcd_devicetype == DBT_DEVTYP_PORT)
                        {
                            Msg = Marshal.PtrToStringUni((IntPtr)(m.LParam.ToInt32() +
                                      Marshal.SizeOf(typeof(DEV_BROADCAST_PORT_Fixed))));
                            System.Diagnostics.Debug.Print("{0} Connected", Msg);
                        }
                        break;
                    case DBT_DEVICEREMOVECOMPLETE:
                        pHdr = (DEV_BROADCAST_HDR)Marshal.PtrToStructure(m.LParam, typeof(DEV_BROADCAST_HDR));
                        if (pHdr.dbcd_devicetype == DBT_DEVTYP_PORT)
                        {
                            Msg = Marshal.PtrToStringUni((IntPtr)(m.LParam.ToInt32() +
                                      Marshal.SizeOf(typeof(DEV_BROADCAST_PORT_Fixed))));
                            System.Diagnostics.Debug.Print("{0} Disconnected", Msg);
                        }
                        break;

                    default:
                        break;
                }
            }

            base.WndProc(ref m);
        }


При включении питания прибора выводится:
COM12 Connected
COM3 Connected
При отключении питания прибора:
COM12 Disconnected
COM6 Disconnected

Если прибор уже включен и выдергивать кабель от каждого USB, то детектирование подключения и отключения происходит без ошибок.

Можно как-то вылечить эту проблему?
wndproc wm_devicechange dbt_devicearrival dbt_deviceremovecomplete
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.