全局低级键盘挂钩不会阻止OEM密钥

时间:2012-08-14 23:30:35

标签: c# .net winapi keyboard-hook

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

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

但是,当上面的代码运行时,它允许使用键盘键或电子邮件键等键。

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

我能在这里做些什么吗?

1 个答案:

答案 0 :(得分:2)

嗯,这应该有效。正常路由是从WM_KEYDOWN消息到由默认窗口过程生成的WM_APPCOMMAND消息。 WM_XBUTTONUP是另一条路线,但不太可能。看看Spy ++,看看是否发生了异常情况。

你也是另一个进程的潜在受害者,这个进程挂在你前面并且没有正确调用CallNextHookEx()。使用TaskMgr.exe,Processes选项卡解决这个问题并开始查杀进程。从任何闻起来像供应商提供的铲子的东西开始,特别是如果键盘上的键不符合WM_APPCOMMAND command set,因此需要这样的程序来添加小玩意。