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
55
/*ловим событие по изменению доступных 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
};

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 не будет опубликован. Обязательные поля помечены *