C# — ловим событие по изменению доступных COM портов в системе (WM_DEVICECHANGE)

Автор: | 28.03.2021

В работе над одним проектом встала задача автоматически в приложении изменять список доступных 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!

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *