В работе над одним проектом встала задача автоматически в приложении изменять список доступных COM портов, все знающий интернет помог, ниже функция которая отслеживает событие при изменении состава оборудования в системе.
Для работы функции подключаем библиотеку класса
1 | using System.Runtime.InteropServices; |
Саму функцию необходимо добавить в класс основной формы приложения, код функции ниже
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 | /*ловим событие по изменению доступных COM портов--------------------------------*/ private struct DEV_BROADCAST_HDR { //отключаем предупреждения компилятора для ошибки 0649 #pragma warning disable 0649 internal UInt32 dbch_size; internal UInt32 dbch_devicetype; internal UInt32 dbch_reserved; //включаем предупреждения компилятора для ошибки 0649 #pragma warning restore 0649 };</span></p> protected override void WndProc(ref Message m) { //это позволяет выполнять поведение базового класса по умолчанию в окне base.WndProc(ref m); if (m.Msg == 0x0219) { //WM_DEVICECHANGE = 0x0219 DEV_BROADCAST_HDR dbh; switch ((int)m.WParam) { case 0x8000: //DBT_DEVICEARRIVAL = 0x8000 dbh = (DEV_BROADCAST_HDR)Marshal.PtrToStructure(m.LParam, typeof(DEV_BROADCAST_HDR)); if (dbh.dbch_devicetype == 0x00000003) { //DBT_DEVTYP_PORT = 0x00000003 //подключен COM порт //отключен какой либо COM порт label1.Text = "Port connected"; //обновляем список COM портов getCOMports(); } break; case 0x8004: //DBT_DEVICEREMOVECOMPLETE = 0x8004 dbh = (DEV_BROADCAST_HDR)Marshal.PtrToStructure(m.LParam, typeof(DEV_BROADCAST_HDR)); if (dbh.dbch_devicetype == 0x00000003) { //DBT_DEVTYP_PORT = 0x00000003 //отключен какой либо COM порт label1.Text = "Port disabled"; //обновляем список COM портов getCOMports(); } break; } } } /*END ловим событие по изменению доступных COM портов----------------------------*/ |
Более подробно о событии wm_devicechange можно почитать тут
Пример в Visual Studio Express 2017
Видео как это все работает
73!