我有一個小應用程式,需要對從系統中添加或洗掉的特定設備做出反應。所以我聽聽WM_DEVICECHANGE使用CreateWindowEx()和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 掃描儀讀取輸入,并需要知道掃描儀是否被移除或添加到系統中。它一直運行到用戶注銷為止。
uj5u.com熱心網友回復:
正如評論中所建議的,我已將視窗/訊息傳遞功能移至單獨的執行緒,現在用于TEvent將設備更改事件發送到主執行緒。到目前為止,這似乎運作良好。
我在這里(以及其他地方)遵循 Remy 的建議來創建視窗和佇列Execute()并DoTerminate()用于清理。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/381759.html
