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);
}
4

3 回答 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'ed 为单个值。

于 2010-01-09T14:22:05.860 回答
0

阅读 Paul DiLascia 撰写的这篇文章可能值得您阅读,他在此处展示了如何捕获 Ctrl+Alt+Del 组合键。在此处此处的 CodeProject 上有一个可用于 .NET 框架的版本。

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

于 2010-01-09T14:08:58.390 回答
0

您应该子类化 win32 消息泵。
也许你会从这个 VC6 项目Trap CtrlAltDel 中得到一些想法;在 Win2000/XP 的任务列表中隐藏应用程序

于 2010-01-09T14:15:53.420 回答