如何挂钩Ctrl-Alt-Tab?

时间:2010-01-09 13:36:59

标签: c# winapi keyboard hook low-level

我正试图在我的程序中挂钩键盘,但有一些我无法完成的事情。下面的方法是我班级中最重要的部分,我处理某些键组合。所有这些都有效,但我也想挂钩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);
}

3 个答案:

答案 0 :(得分:2)

世界,您正在正确捕获键,但您需要对lParam.flags执行按位AND运算,以确定是否按下了多个修饰键。

这是我的头脑,但我认为代码看起来像这样:

(lParam.flags == 32)

应该看起来像:

((lParam.flags & 32 == 32) && (lParam.flags & 16 == 16))
在该示例中,

32和16是任意的。您需要弄清楚ALT和CTRL实际上是什么值。它们将分别为1,2,4 ...... 16,32等,以便它们可以一起“或”成一个值。

答案 1 :(得分:0)

看看Paul DiLascia的这篇文章可能值得您花些时间来展示如何捕获按键Ctrl + Alt + Del组合here。在CodeProject herehere上可以找到适用于.NET框架的版本。

希望这有帮助, 最好的祝福, 汤姆。

答案 2 :(得分:0)

您应该将win32消息泵子类化 也许你会从这个VC6项目中获得一些想法Trap CtrlAltDel; Hide Application in Task List on Win2000/XP