2013-10-26 31 views
-1

我正在處理visual C++ 2012 update 3中的一個項目。我需要鉤住鍵盤一段時間,並且只允許用戶輸入密碼。因此,我禁用除鍵入密碼所需的所有密鑰。它運作良好。但解除後,alt鍵自動按下。我的意思是解開後,如果我按Tab鍵,它就像我按Alt + Tab一樣工作。在Windows 8中,按下win鍵。但是,一旦我在鍵盤上手動按下alt鍵,問題就解決了。但這對我來說是一個非常嚴重的情況,因爲用戶由於這種奇怪的行爲而肯定會失去對應用程序的信任。任何人都可以幫忙。在Visual C++的鍵盤掛鉤後發生意外的行爲

LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam) 
{ 

if (nCode < 0 || nCode != HC_ACTION) return CallNextHookEx(NULL, nCode, wParam, lParam); 

KBDLLHOOKSTRUCT* p = (KBDLLHOOKSTRUCT*) lParam; 

if(
    (p->vkCode == VK_BACK) || 
    (p->vkCode == VK_SHIFT) || 
    (p->vkCode == VK_CAPITAL) || 
    (p->vkCode == VK_SPACE) || 
    (p->vkCode == VK_HOME) || 
    (p->vkCode == VK_END) || 
    (p->vkCode == VK_LEFT) || 
    (p->vkCode == VK_RIGHT) || 
    (p->vkCode == VK_DELETE) || 
    (p->vkCode >= 0x30 && p->vkCode <= 0x39) || 
    (p->vkCode >= 0x41 && p->vkCode <= 0x5A) || 
    (p->vkCode >= 0x60 && p->vkCode <= 0x6F) || 
    (p->vkCode == 0x90) || 
    (p->vkCode == 0x91) || 
    (p->vkCode == 0xA0) || 
    (p->vkCode == 0xA1) || 
    (p->vkCode >= 0xBA && p->vkCode <= 0xC0) || 
    (p->vkCode >= 0xDB && p->vkCode <= 0xDF) || 
    (p->vkCode == 0xE2) 
    ) 
    { 
     return CallNextHookEx(NULL, nCode, wParam, lParam); 
    } 
    else 
     return 1; 
} 
+0

程序啓動時是否正在等待? – chris

+0

用戶插入密碼後,我的程序即將關閉。 alt鍵在程序關閉後被保留 – Jasir

+2

我的觀點是如果用戶在程序啓動時持有alt鍵,那麼keyup會被您的鉤子佔用,並且在程序關閉後仍然沒有鍵盤,因此係統認爲它是下。 – chris

回答

1

如果您的應用程序開始之前,按下Alt鍵,或按住當你的應用程序無法將其連接(例如,發送到以管理員身份運行一個程序的窗口),你的鉤子會吃的KEYUP它和系統的其他部分在用戶停止按下時仍會認爲它被按下。

您可以使用SendInput在掛鉤完成後(或者在掛鉤過程中使用過濾器)發送掛鉤,但不能確保獲得keydown的窗口知道掛鉤。我不確定在那裏這個部分的一個特別簡單的解決方案。