C#接收即插即用事件

3
我想知道是否有关于如何处理Windows中使用的即插即用事件消息的示例和/或文档。理想情况下,我要达到的目标是:在不必拥有一个定时器的情况下,使我的应用程序能够检测到已连接到计算机上的设备。 我发现这样做非常低效,并将导致我的应用程序CPU使用率增加十倍。我的应用程序是使用C#编写的,并且当前正在利用.NET 4.0,我们计划在下个月升级到.NET 4.5。因此,我正在寻找一些相关文献。由于这是我首次尝试支持即插即用设备,请对批评温和些。
编辑:此应用程序还将在Windows 7和Windows XP上运行。
1个回答

3

在过去编写文件浏览器时,我使用了一个虚拟的 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


太棒了!有没有办法获取已连接设备的名称?即使没有,这绝对是我在寻找的,非常感谢。 - Jimmy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接