2015-08-21 66 views
1

我在Delphi中創建了一個應用程序,它可以處理一些定義好的系統範圍的熱鍵,完美地工作。但是,對於某些熱鍵功能,我必須觸發/模擬一些鍵盤筆劃,例如ALT + ENTER。這在用戶直接釋放熱鍵時非常有用,但是當用戶仍然按下鍵時,鍵盤模擬失敗。Windows api:等到所有鍵盤按鍵全系統釋放後

在處理鍵盤模擬之前,有沒有一種方法(用windows API)來檢查是否所有的鍵都被釋放了?

+0

爲什麼不使用內置熱鍵支持的動作管理器?還是你想在應用程序之外捕獲這些事件?另一方面,我們需要了解當前代碼的工作原理,以便能夠告知如何繼續。 –

+0

僞造輸入是一件棘手的事情。通常最好避免。 –

+0

感謝您的評論。此問題與此問題有關:http://stackoverflow.com/questions/32062929/directx-full-screen-window-to-windowed-by-window-handle-with-use-windows-api-fun。如果您知道如何管理DirectX窗口,則不需要任何密鑰。在這種情況下並不棘手,因爲我可以檢查窗口的狀態。如果不應用ALT + ENTER,則不會發生任何情況。已經更改了代碼分配。是的,熱鍵在應用程序之外進行處理,因此動作管理器無用。但爲什麼所有這些關切?請回答我的問題,我知道我在做什麼,爲什麼。 – Codebeat

回答

0

由於去@大衛易經和@大衛赫弗南(二大衛!)的解決方案不僅要測試鍵盤輸入也鼠標輸入或更好,輸入設備的狀態。

鼠標也包括在內,因爲:

{ 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; 
0

使用GetAsyncKeyState,因爲此API反映鍵盤的真實當前狀態,而不是當您的應用最後調用GetMessage時。只需編寫一個循環來調用0到0xFF之間的每個值。

如果最顯著位設置,關鍵是下

+0

啊,謝謝!我會試試這個。 – Codebeat

+0

這聽起來不像正確的方法 –

+0

@DavidHeffernan:爲什麼不呢? –