c#接收即插即用事件

本文关键字:事件 即插即用 | 更新日期: 2023-09-27 18:24:13

我想知道是否有关于如何处理Windows中使用的即插即用事件消息的示例和/或文档。理想情况下,我试图实现的是能够让我的应用程序检测到一个连接到机器的设备,而不必有一个计时器,它会轮询所有COM端口。我发现这样做效率极低,而且会使应用程序的CPU使用量增加十倍。我的应用程序是C#,目前正在利用.NET 4.0,我们希望在下个月内升级到.NET 4.5。因此,我正在寻找一些关于如何做到这一点的文献。由于这是我第一次考虑支持即插即用设备,请对批评保持温和。

编辑:此应用程序也将在Windows 7和Windows XP 上运行

c#接收即插即用事件

我过去在编写文件浏览器时已经完成了这一点,方法是使用伪HwndSource并通过HwndSource.AddHook()方法添加事件处理程序。

// In object constructor
var hwndSource = new HwndSource(0, 0, 0, 0, 0, "", IntPtr.Zero); // Set up dummy HwndSource
hwndSource.AddHook(sourceHook);
IntPtr sourceHook(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
{
    if (msg = WM_DEVICECHANGE)
        if (wParam.ToInt32 == DBT_DEVICEARRIVAL) // Do what you need to do
        if (wParam.ToInt32 == DBT_DEVICEREMOVALCOMPLETE) // Handle device removal
}
// Uses these defined constants:
private const int WM_DEVICECHANGE = 0x219;
private const int DBT_DEVICEARRIVAL = 0x8000;
private const int DBT_DEVICEREMOVALCOMPLETE = 0x8004;

WM_DEVICECHANGE的MSDN还提供了其他可能有用的常量定义的信息:http://msdn.microsoft.com/en-us/library/windows/desktop/aa363480(v=vs.85).aspx