在Win32上,我想知道如何使用Perl,Python或Ruby(或甚至C)來檢測是左鍵還是右鍵ALT?在Win32上,如何檢測使用Perl,Python或Ruby(或C)是否按下了左移或右移ALT?
不只是針對當前窗口,而是全局環境。例如:當我輸入文檔時,我可以按右ALT鍵啓動用Ruby編寫的音樂播放器,然後再次按右ALT鍵,它可以暫停或停止程序。謝謝。
在Win32上,我想知道如何使用Perl,Python或Ruby(或甚至C)來檢測是左鍵還是右鍵ALT?在Win32上,如何檢測使用Perl,Python或Ruby(或C)是否按下了左移或右移ALT?
不只是針對當前窗口,而是全局環境。例如:當我輸入文檔時,我可以按右ALT鍵啓動用Ruby編寫的音樂播放器,然後再次按右ALT鍵,它可以暫停或停止程序。謝謝。
您需要設置低級鍵盤掛鉤。通過使用LowLevelKeyboardProc調用SetWindowsHookEx來完成此操作,然後觀察相應的virtual key code。
有左,右移和鍵的鍵碼。
我相信你也可以通過GetKeyState獲得虛擬鍵的狀態,例如,函數GetKeyState(VK_RSHIFT)。儘管使用Reed Copsey所描述的鉤子可能更適合您的目的,而不是輪詢此功能。
如果你想知道的鑰匙的當前狀態,現在,你可以使用GetAsyncKeyState()
與VK_LSHIFT
或VK_RMENU
分別左移右ALT參數。確保測試結果的最高有效位,因爲結果包含多於一位的信息,例如,
if(GetAsyncKeyState(VK_LSHIFT) & 0x8000)
; // left shift is currently down
如果改爲希望收到按鍵取代查詢異步的,你應該聽的WM_KEYDOWN
窗口通知。把這樣的事情在你的窗口消息處理程序:
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
{
switch(msg)
{
...
case WM_KEYDOWN:
if(wparam == VK_LSHIFT)
; // left shift was pressed
// etc.
break;
}
}
你還必須處理WM_KEYUP
消息知道鍵被釋放時。
不,VK_SHIFT而不是VK_LSHIFT將作爲WM_KEYDOWN中的wparam給出,請參閱http://msdn.microsoft.com/en-us/library/windows/desktop/ms646280%28v=vs.85%29.aspx我是我現在正在尋找一種解決方法。 – cib 2013-04-12 08:09:25
而不是WM_KEYDOWN和WM_KEYUP,使用WM_SYSKEYDOWN和WM_SYSKEYUP;那麼你可以檢查它是否是VK_LSHIFT或VK_MENU等,它會捕獲這些事件。
如果用戶在按住[Alt]鍵的同時鍵入一個鍵**,則發送WM_SYSKEY [DOWN | UP]。這不是OP要求的。他們希望在按下右側的[Alt]鍵時得到通知。低級別鍵盤鉤子中的「WM_KEYDOWN」是正確的解決方案。 – IInspectable 2017-03-05 23:43:19
在您引用的鏈接中提到了這一點,但要記住一件好事:系統會爲這些回調強制超時,因此最好不要在其中執行太多計算。 – asveikau 2009-11-28 01:16:33
是的。如果你需要做長時間的工作,你應該將它排列在另一個線程中進行處理,而不是在鉤子本身中進行處理。 – 2009-11-28 01:26:25