在进行C#串口开发时,往往需要对可访问的串口通过ComboList组件进行呈现共用户进行选择软件需要连接的串口,在这过程中就需要对串口的插拔事件进行监听。当事件到来对列表、串口开关进行对应的变化。使得整个软件操作起来更加合理。
在WPF中,每一个窗口都拥有一个Loaded事件传入接口,可以将函数传入该接口(即把函数委托给Loaded事件)。Loaded事件在元素即将要被渲染时触发。
在Loaded时定义拦截Windows消息拦截事件。事件函数(DeviceChanged)被委托给HwndSource的Hook。
在DeviceChanged函数中过滤串口插拔事件,并执行串口插拔后需要完善的逻辑操作。
>
> 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;
> }
> ```
>
>
通过该方法可以实现对串口插拔事件的监听。
参考文献