【问题标题】:c# receive plug and play eventsc#接收即插即用事件
【发布时间】:2013-07-21 16:03:30
【问题描述】:

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

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

【问题讨论】:

    标签: c# windows plug-and-play


    【解决方案1】:

    我在过去使用虚拟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 还包含其他可能有用的 const 定义的信息: http://msdn.microsoft.com/en-us/library/windows/desktop/aa363480(v=vs.85).aspx

    【讨论】:

    • 太棒了!不会有办法获取已连接设备的名称吗?即使没有,这绝对是我要寻找的 tyvm。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-11
    • 1970-01-01
    • 2017-06-09
    • 1970-01-01
    • 2018-04-23
    • 1970-01-01
    相关资源
    最近更新 更多