C# 监听串口插拔事件
场景简述
在进行C#串口开发时,往往需要对可访问的串口通过ComboList组件进行呈现共用户进行选择软件需要连接的串口,在这过程中就需要对串口的插拔事件进行监听。当事件到来对列表、串口开关进行对应的变化。使得整个软件操作起来更加合理。
方法介绍
在WPF中,每一个窗口都拥有一个Loaded事件传入接口,可以将函数传入该接口(即把函数委托给Loaded事件)。Loaded事件在元素即将要被渲染时触发。
在Loaded时定义拦截Windows消息拦截事件。事件函数(DeviceChanged)被委托给HwndSource的Hook。
在DeviceChanged函数中过滤串口插拔事件,并执行串口插拔后需要完善的逻辑操作。
- 事件序号:0x219 移动设备改变事件。0x8000设备插入事件。0x8004设备拔出事件。
具体实现
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
| public MainWindow() { Loaded+=MainWindow_Loaded; }
void MainWindow_Loaded(object sender,RoutedEventArgs e) { HwndSource hwndSource = PresentationSource.FromVisual(this) as HwndSource; if(null!=hwndSource) hwndSource.AddHook(new HwndSourceHook(DevieceChanged)); }
private IntPtr DeviceChanged(IntPtr hwnd,int msg,IntPtr wParam,IntPtr lParam,ref bool handled) { string[] PortNames; if (msg == WM_DEVICECHANGE) { switch (wParam.ToInt32()) { case DBT_DEVICEARRIVAL: PortNames = SerialPort.GetPortNames(); if (IsWorking == true && PortNames.Contains(ConfigInfo.Port)) { if (serialPortUtil != null) { serialPortUtil.OpenPort(); MsgBox.Show("串口连接成功!"); } } break; case DBT_DEVICEREMOVECOMPLETE: PortNames = SerialPort.GetPortNames(); if (IsWorking == true && !PortNames.Contains(ConfigInfo.Port)) { MsgBox.Show("串口连接断开!"); } break; default: break; } } return IntPtr.Zero; }
|
通过该方法可以实现对串口插拔事件的监听。
参考文献
C# WPF USB 串口插入拔出识别监测