2010-01-09 142 views
2

我試圖在我的程序中鉤住鍵盤,但有些東西是我無法完成的。下面的方法是我班中處理某些組合鍵的最重要的部分。所有這些工作,但我也想鉤住Ctrl-Alt-Tab。我花了好幾個小時試圖弄清楚該怎麼做,但我空手而歸。我怎樣才能鉤住這個組合呢?如何掛鉤Ctrl-Alt-Tab?

更多信息可以在這裏找到:
http://msdn.microsoft.com/en-us/library/ms644967(VS.85).aspx
http://msdn.microsoft.com/en-us/library/ms927178.aspx

private static IntPtr KeyboardHookHandler(int nCode, IntPtr wParam, KBDLLHookStruct lParam) 
{ 
    if (nCode == 0) 
    {    

    if (((lParam.flags == 32) && (lParam.vkCode == 0x09)) ||  // Alt+Tab 
     ((lParam.flags == 32) && (lParam.vkCode == 0x1B)) ||  // Alt+Esc 
     ((lParam.flags == 0) && (lParam.vkCode == 0x1B)) ||  // Ctrl+Esc 
     ((lParam.flags == 1) && (lParam.vkCode == 0x5B)) ||  // Left Windows Key 
     ((lParam.flags == 1) && (lParam.vkCode == 0x5C)) ||  // Right Windows Key 
     ((lParam.flags == 32) && (lParam.vkCode == 0x73)) ||  // Alt+F4    
     ((lParam.flags == 32) && (lParam.vkCode == 0x20)))  // Alt+Space 

    { 
     return new IntPtr(1); 
    } 
    } 

    return CallNextHookEx(hookPtr, nCode, wParam, lParam); 
} 

回答

2

世界,你是正確捕捉按鍵,但你需要在你的lParam.flags執行位與運算,以確定一個以上修飾鍵是否被按下。

這是從我的頭頂,但我認爲,看起來像這樣的代碼:

(lParam.flags == 32) 

應該是這個樣子:

((lParam.flags & 32 == 32) && (lParam.flags & 16 == 16)) 

32和16在這個例子中隨意。你需要弄清楚ALT和CTRL實際是什麼值。它們將是1,2,4 ... 16,32等,以便它們可以被合併成單個值。

+0

LCTRL在按下時標記爲0,釋放時爲128。 RCTRL在按下時標記1,在釋放時爲129。系統不會給我與鍵對應的三個標誌的總和。我最多隻能捕捉兩把鑰匙。 – user246392 2010-01-09 16:19:13

0

這可能是值得你看看這個文章作者簡介Paul DiLascia誰顯示陷阱如何將鍵Ctrl + Alt + Del鍵組合here。有一個可用於CodeProject herehere上的.NET框架的版本。

希望這會有所幫助, 最好的問候, 湯姆。