我在Delphi中創建了一個應用程序,它可以處理一些定義好的系統範圍的熱鍵,完美地工作。但是,對於某些熱鍵功能,我必須觸發/模擬一些鍵盤筆劃,例如ALT + ENTER。這在用戶直接釋放熱鍵時非常有用,但是當用戶仍然按下鍵時,鍵盤模擬失敗。Windows api:等到所有鍵盤按鍵全系統釋放後
在處理鍵盤模擬之前,有沒有一種方法(用windows API)來檢查是否所有的鍵都被釋放了?
我在Delphi中創建了一個應用程序,它可以處理一些定義好的系統範圍的熱鍵,完美地工作。但是,對於某些熱鍵功能,我必須觸發/模擬一些鍵盤筆劃,例如ALT + ENTER。這在用戶直接釋放熱鍵時非常有用,但是當用戶仍然按下鍵時,鍵盤模擬失敗。Windows api:等到所有鍵盤按鍵全系統釋放後
在處理鍵盤模擬之前,有沒有一種方法(用windows API)來檢查是否所有的鍵都被釋放了?
由於去@大衛易經和@大衛赫弗南(二大衛!)的解決方案不僅要測試鍵盤輸入也鼠標輸入或更好,輸入設備的狀態。
鼠標也包括在內,因爲:
{ Virtual Keys, Standard Set }
VK_LBUTTON = 1;
VK_RBUTTON = 2;
VK_MBUTTON = 4; { NOT contiguous with L & RBUTTON }
所以,如果不想測試mousebuttons你必須從循環中排除。最好檢查這些也是因爲有鼠標必須使用熱鍵。最好檢查輸入上的所有內容是否空閒。
function isUserInputDevicesInUse() : Boolean; // Keyboard pressed/mouse pressed?
var
i : LongInt;
begin
i:=256;
Result:=FALSE;
while(i > 0) and (NOT Result) do
begin
Dec(i);
Result:=(GetAsyncKeyState(i) < 0);
end;
end;
function isUserInputDevicesIdle() : Boolean;
begin
Result:=NOT isUserInputDevicesInUse();
end;
使用GetAsyncKeyState,因爲此API反映鍵盤的真實當前狀態,而不是當您的應用最後調用GetMessage
時。只需編寫一個循環來調用0到0xFF之間的每個值。
如果最顯著位設置,關鍵是下
爲什麼不使用內置熱鍵支持的動作管理器?還是你想在應用程序之外捕獲這些事件?另一方面,我們需要了解當前代碼的工作原理,以便能夠告知如何繼續。 –
僞造輸入是一件棘手的事情。通常最好避免。 –
感謝您的評論。此問題與此問題有關:http://stackoverflow.com/questions/32062929/directx-full-screen-window-to-windowed-by-window-handle-with-use-windows-api-fun。如果您知道如何管理DirectX窗口,則不需要任何密鑰。在這種情況下並不棘手,因爲我可以檢查窗口的狀態。如果不應用ALT + ENTER,則不會發生任何情況。已經更改了代碼分配。是的,熱鍵在應用程序之外進行處理,因此動作管理器無用。但爲什麼所有這些關切?請回答我的問題,我知道我在做什麼,爲什麼。 – Codebeat