我有一個作業的Windows鉤子,可以檢測LCTRL x和LCTRL v的簡單按鍵組合。我遇到的唯一問題是,當我按下LCTRL,然后釋放,然后按x或v,我的程式認為它們仍然被按在一起。 下面是我的鉤子回呼函式:
我的鉤子回呼函式
HHOOK hookHandle。
KBDLLHOOKSTRUCT hookdata。
LRESULT __stdcall HookCallback(int code, WPARAM wparam, LPARAM lparam)
{
if (code >= 0)
{
if (wparam == WM_KEYDOWN)
{
hookdata = *((KBDLLHOOKSTRUCT*)lparam);
switch(hookdata.vkCode)
{
case(88)。
if(GetAsyncKeyState(VK_LCONTROL))
{
std::cout<<"CTRL X PRESSED"/span>。
}
break;
case(86)。
if(GetAsyncKeyState(VK_LCONTROL)
{
std::cout<<"CTRL V PRESSED"/span>。
}
break;
}
}
}
return CallNextHookEx(hookHandle, code, wparam, lparam)。
}
輸入示例
Test 1) 按LCTRL,按X
測驗 2) 按LCTRL,釋放LCTRL,按X
預期輸出
Test 1) 按下CTRL X鍵
測驗 2) 沒有輸出
實際輸出
Test 1) CTRL X PRESSED (作業)。
測驗2) CTRL X PRESSED (不作業)
uj5u.com熱心網友回復:
你錯誤地檢查了GetAsyncKeyState的回傳值:
如果函式成功,回傳值指定了自上次呼叫GetAsyncKeyState以來是否按下了鍵,以及該鍵目前是向上還是向下。如果最重要的位被設定,則該鍵是向下的,如果最不重要的位被設定,則該鍵在上次呼叫 GetAsyncKeyState 之后被按下。然而,您不應該依賴最后的行為;有關詳細資訊,請參見備注。
將檢查改為 GetAsyncKeyState(..) & 0x8000,通過只檢查最高位來解決這個問題。
一件小事:微軟讓VK值與ASCII碼相同。由于完全的可移植性在這里并不重要,你可以使用'X'和'V'而不是88和86來更好地表達意圖。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/333969.html
標籤:
下一篇:將字串轉換為Arduino的字符
