.net - 如何在没有窗口句柄的情况下使用 RegisterDeviceNotification?

标签 .net vb.net dll usb winusb

我正在编写一个 DLL 库,它使用 VB.NET 中的 winusb 连接到 USB 设备。

因为它是一个 DLL,所以我没有窗口,而且我的库的用户也可能没有窗口(例如命令行应用程序)。

我看到的检测设备附加和分离的示例都使用 RegisterDeviceNotification,它需要一个窗口句柄来接收附加/分离消息。

如何在没有窗口获取句柄的情况下将这些消息直接接收到函数中?

最佳答案

对于没有 GUI 的应用程序,我最近发现了一个看起来比 RegisterDeviceNotification 更优雅的解决方案。

    void onEventArrived(object sender, EventArrivedEventArgs e)
    {
        ManagementBaseObject _o = e.NewEvent["TargetInstance"] as ManagementBaseObject;

        if (_o != null)
        {
            using (ManagementObject mo = new ManagementObject(_o["Dependent"].ToString()))
            {
                if (mo != null)
                {
                    try
                    {
                        if (mo.GetPropertyValue("DeviceID").ToString() != string.Empty)
                        {
                            //connected
                        }
                    }

                    catch (ManagementException ex)
                    {
                        //disconnected
                    }
                }
            }
        }
    }

通过调用初始化这段代码

        System.Management.WqlEventQuery _q = new WqlEventQuery("__InstanceOperationEvent", "TargetInstance ISA 'Win32_USBControllerDevice' ");
        _q.WithinInterval = TimeSpan.FromSeconds(1);
        ManagementEventWatcher _w = new ManagementEventWatcher(_q);
        _w.EventArrived += new EventArrivedEventHandler(onEventArrived);
        _w.Start();

还要确保添加对 System.Management 的引用

关于.net - 如何在没有窗口句柄的情况下使用 RegisterDeviceNotification?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10022794/

相关文章:

asp.net-mvc - 如何在 razor 代码块中插入空格?

java - 尝试使用tomcat在servlet中加载dll时出现NoClassDefFoundError

visual-c++ - 什么可能会阻止 DLL 使用 LoadLibrary 加载?

dll - 如何做加载/库

c# - Web 服务无法打开命名管道 - 访问被拒绝

.NET Core GetCurrentDirectory 返回父目录

c# - 在与 Ninject 绑定(bind)时使用通用类型——这可能吗?

mysql - 无法在 MySQL 中保存大图像

c# - 如何获得浏览量最高的前5名产品?

vb.net - 无法加载文件或程序集 System.Data.SQLite - Windows 应用程序