关于C#:全局低级键盘挂钩不能阻止OEM按键

Global low level keyboard hook not preventing OEM keys

我编写了以下方法来防止所有按键被按下:

1
2
3
4
5
6
7
8
9
10
11
12
13
private IntPtr HookHandler(int nCode, IntPtr wParam, ref KBDLLHOOKSTRUCT lParam)
{
    if (nCode >= 0)
    {
        ...

        //Return a nonzero value to prevent the system from passing the message to the
        //rest of the hook chain or the target window procedure.
        return (IntPtr)1;
    }

    return NativeMethods.CallNextHookEx(_hookID, nCode, wParam, ref lParam);
}

但是,当上面的代码运行时,它允许诸如键盘的calc键或email键之类的键。

我调试了,代码确实到达了return (IntPtr)1;行(并且确实显示了正在按下的键),但是到那时,calc窗口(或其他窗口)已经打开。即使我返回1,也为时已晚。

在这里我可以做些不同的事情吗?


好吧,那应该行得通。常规路由是从WM_KEYDOWN消息到默认窗口过程生成的WM_APPCOMMAND消息。 WM_XBUTTONUP是另一条路线,但不太可能。与Spy一起查看是否有异常情况发生。

您还可能是另一个进程钩住您之前的键的潜在受害者,并且没有正确调用CallNextHookEx()。使用TaskMgr.exe的"进程"选项卡进行处理,然后开始终止进程??。从任何闻起来像供应商提供的铲子的东西开始,尤其是如果键盘上的按键不适合WM_APPCOMMAND命令集,因此需要这样的程序来添加小控件。