-1

我有一个小应用程序需要对系统中添加或删除的特定设备做出反应。所以我听WM_DEVICECHANGE使用CreateWindowEx()and RegisterDeviceNotification()

这似乎可行 - 但是,我不确定如何正确检查消息队列。简而言之,这是我目前的方法:

procedure Main();

  procedure HandleMessages(aWndHandle: HWND);
  var
    lpMsg: TMsg;
  begin
    while PeekMessage(lpMsg, aWndHandle, 0, 0, PM_REMOVE) do
      DispatchMessage(lpMsg);  
  end;

begin
  // ...  
  if (RegisterClassEx(wClass) = 0) then System.Exit;
  wndHnd := CreateWindowEx(0, PChar(wClass.lpszClassName), nil, 0, 0, 0, 0, 0, HWND_MESSAGE, 0, HInstance, nil);
  // ...
  notificationHandle := RegisterDeviceNotification(wndHnd, @bcInterface, DEVICE_NOTIFY_WINDOW_HANDLE);

  while True do
  begin
    HandleMessages();
    DoThings();

    HandleMessages();
    DoOtherThings();

    HandleMessages();
    DoYetMoreThings();
  end;

  // ... (cleanup)
end;

这个while True do循环重复调用是否HandleMessages()可行?或者我是否需要担心一些隐藏的问题——例如,如果其中一个DoThings()例程需要很长时间才能返回?
这对我来说似乎有点尴尬,我(怀疑......)似乎无法在网上找到任何可比较的例子......

编辑:此应用程序没有 UI 或控制台,也没有交互。它从 HID 扫描仪读取输入,并且需要知道扫描仪是否被移除或添加到系统中。它一直运行到用户注销。

4

1 回答 1

0

正如评论中所建议的,我已将窗口/消息传递功能移至单独的线程,现在用于TEvent向主线程发送设备更改事件信号。到目前为止,这似乎运作良好。
我在这里(以及其他地方)遵循了 Remy 的建议来创建窗口并排队Execute()DoTerminate()用于清理。

于 2021-12-14T10:03:57.230 回答