c#接收即插即用事件

标签 c# windows plug-and-play

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

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

最佳答案

我在过去通过使用虚拟 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

关于c#接收即插即用事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17795726/

相关文章:

c# - 当命令需要结果数据时,如何应用命令查询分离 (CQS)?

c# - 在变换 y 轴上切换翻转

c# - Silverlight 和一个表单应用程序

将 const char* 转换为 LPCTSTR

c++ - 如何使用 SetTimer API

c# - 应用挂起我的 Windows Phone 7 手机

python - 在 Windows 上安装 Airflow

windows - 设备被误检测为串行鼠标

c# - 将文件写入连接到 Windows PC 的 PNP 设备