Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 全局低级键盘挂钩不阻止OEM键_C#_.net_Winapi_Keyboard Hook - Fatal编程技术网

C# 全局低级键盘挂钩不阻止OEM键

C# 全局低级键盘挂钩不阻止OEM键,c#,.net,winapi,keyboard-hook,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 th

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

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键等键

我调试,代码确实到达
返回(IntPtr)1行(并正确显示按下的键),但此时,计算窗口(或其他)已打开。即使我返回1,也太晚了


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

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


您也是另一个进程的潜在受害者,该进程钩住了您前面的键,并且没有正确调用CallNextHookEx()。使用TaskMgr.exe的“进程”选项卡解决此问题,并开始终止进程。从任何闻起来像供应商提供的铲子的东西开始,特别是如果键盘上的键不适合,因此需要这样的程序来添加小发明。

按照Hans的建议,我会在一个干净安装Windows的VM上测试它,以消除第三方软件。谢谢。结果是
MicrosoftIntelliType Pro
。我终止了进程,我的代码按预期工作。问题:对此我能做些什么吗?任何先到达那里的进程都可以在我有机会阻止它之前做一些事情。有没有办法确保我的代码是第一个处理消息的?