如何钩取Ctrl-Alt-Tab?

3
我正在尝试在我的程序中挂钩键盘,但有一些问题我无法解决。下面的方法是我处理某些键组合的类中最重要的部分。它们都有效,但我也想挂钩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个回答

2

你已经正确地捕获了按键,但需要对lParam.flags执行按位与操作,以确定是否按下了多个修改键。

这是我头脑中的想法,但我认为代码应该像这样:

(lParam.flags == 32)

应该看起来像这样:
((lParam.flags & 32 == 32) && (lParam.flags & 16 == 16))

这个例子中的32和16是任意的。您需要弄清楚ALT和CTRL实际上是什么值。它们将是1、2、4……16、32等,以便它们可以被OR在一起形成单个值。


当按下LCTRL时,其标志位为0,松开时为128。当按下RCTRL时,其标志位为1,松开时为129。系统不会给出对应于这三个键的标志位之和。我最多只能捕获两个键。 - user246392

0

你可能值得一看,保罗·迪拉西亚(Paul DiLascia)在这篇文章中展示了如何捕获 Ctrl+Alt+Del 组合键这里。在 CodeProject 上可以找到适用于 .NET 框架的版本这里这里

希望这能帮到你, 最好的祝愿, 汤姆。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接