正在等待连接HID读卡器

本文关键字:读卡器 HID 连接 在等待 | 更新日期: 2023-09-27 18:28:26

我正在编写一个需要将HID读卡器连接到系统的应用程序。当应用程序启动时,读卡器已经连接好,一切都正常工作,所以我知道我可以正确地找到设备。(我正在使用PM> Install-Package hidlibrary中的HID类。)

我想添加一个功能,如果找不到读卡器,程序将显示连接读卡器的提示。

这是我的第一次尝试:

public class App : Application
{
    public static List<HidDevice> HidDeviceList;
    // Block until device is plugged in
    static ManualResetEvent m_WaitForPlugin = new ManualResetEvent(false);
    // WMI Watcher for actual plug-in event
    static ManagementEventWatcher watcher = new ManagementEventWatcher();
    [STAThread()]
    static void Main()
    {
        ShowSplashScreen();
        FindCardReader();
        CloseSplashScreen();
        new App();
    }
    public App() : base()
    {
        StartupUri = new System.Uri("MainWindow.xaml", UriKind.Relative);
        Run();
    }
    private static void FindCardReader()
    {
        ShowOnSplashScreen("Searching for card reader");
        do
        {
            int VendorID = Convert.ToInt32(Settings.Default.ReaderVID, 16); // 0x0801
            int ProductID = Convert.ToInt32(Settings.Default.ReaderPID, 16); // 0x0002
            HidDeviceList = HidDevices.Enumerate(VendorID, ProductID).ToList();
            if (HidDeviceList.Count > 0) {
                break;
            }
            ShowOnSplashScreen("Please attach card reader...");
            SetupWatcher();
            m_WaitForPlugin.WaitOne();
        } while (HidDeviceList.Count == 0);
    }
    private static void SetupWatcher()
    {
        WqlEventQuery query = new WqlEventQuery("SELECT * FROM Win32_DeviceChangeEvent WHERE EventType = 2");
        watcher.EventArrived += new EventArrivedEventHandler(delegate(Object sender, EventArrivedEventArgs e)
        {
            ShowOnSplashScreen("New device detected!");
            m_WaitForPlugin.Set();
        });
        watcher.Query = query;
        watcher.Start();
    }

Main中的FindCardReader()按预期阻塞,但在插入新设备时似乎从未发出信号

我不知道如何单独测试WMI观察程序(我在PowerShell中测试了查询,它似乎可以工作)。我也试着在new Thread中启动它,但结果是一样的。

正在等待连接HID读卡器

事实证明,这段代码中存在一个非常明显的死锁。我重新构建了整个系统以避免这个问题,而不是添加额外的线程来处理锁定。