我有一个小应用程序需要对系统中添加或删除的特定设备做出反应。所以我听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 扫描仪读取输入,并且需要知道扫描仪是否被移除或添加到系统中。它一直运行到用户注销。