2010-01-09 80 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框架的版本。

希望这会有所帮助, 最好的问候, 汤姆。