Winapi 被抑制的键盘消息不';别死

Winapi 被抑制的键盘消息不';别死,winapi,Winapi,我经常使用一个特定的应用程序(它是封闭源代码、单线程、32位、本机的),它早于可配置密钥绑定等细节。不过,它确实支持插件,所以我正在制作一个插件来提供缺少的功能 我正在使用setwindowshookx添加WH\u键盘hook。有些按键没有改变,有些则被抑制并手动处理。对于后一种情况,我(如图所示)只返回1,而忽略CallNextHookEx的输出。这在大多数情况下都有效,但至少有一种情况——Ctrl+D——应用程序仍在处理,即使我告诉它不要这样做 我是否应该做更多/不同的事情来挤压击键 可能相

我经常使用一个特定的应用程序(它是封闭源代码、单线程、32位、本机的),它早于可配置密钥绑定等细节。不过,它确实支持插件,所以我正在制作一个插件来提供缺少的功能

我正在使用
setwindowshookx
添加
WH\u键盘
hook。有些按键没有改变,有些则被抑制并手动处理。对于后一种情况,我(如图所示)只返回1,而忽略
CallNextHookEx
的输出。这在大多数情况下都有效,但至少有一种情况——Ctrl+D——应用程序仍在处理,即使我告诉它不要这样做

我是否应该做更多/不同的事情来挤压击键

可能相关:通常我会得到每条消息的
HC\u-NOREMOVE
HC\u-ACTION
版本,但对于Ctrl+D,我只会得到
HC\u-ACTION
版本

C#资料来源:

private IntPtr ProcessWindowsMessage(intcode、IntPtr wParam、IntPtr lParam)
{
如果(代码<0 | |代码==HC|NOREMOVE)
{
返回Win32.CallNextHookEx(IntPtr.Zero、code、wParam、lParam);
}
Keys key=GetKeyFromWParam(wParam);
Keys keyCombo=key | GetCurrentModifiers();
var isKeyDownEvent=isKeyDownEvent(LPRAM);
var handled=stateMachine.Add(keyCombo,isKeyDownEvent);
如果(已处理)
{
Win32.CallNextHookEx(IntPtr.Zero、代码、wParam、LPRAM);
返回LResultHandled;
}
其他的
{
返回Win32.CallNextHookEx(IntPtr.Zero、code、wParam、lParam);
}
}
私有静态只读IntPtr LResultHandled=new IntPtr(1);

文档没有说返回非零,而是调用
CallNextHookEx
。您应该始终调用
CallNextHookEx
,因为“其他安装了
WH\u-KEYBOARD
钩子的应用程序将不会收到钩子通知,并且可能因此行为不正确。”公平点。我已经在代码中对其进行了更改,并更新了上面的源代码列表。只有在启用了特定的其他插件时,才会出现此问题。可能我们都在尝试做类似的事情,但只是没有很好地配合。实际上,文档表明,如果
code
为>=0,并且您的钩子处理消息,您不必调用
CallNextHookEx
。通常不清楚Microsoft文档,但这是我的理解。您确定另一个“插件”不轮询键盘,只使用GetAsynchKeyState检查是否按下了某些键?如果是这样的话,这个插件就不会使用那些你想要跟踪和忽略的消息。
    private IntPtr ProcessWindowsMessage(int code, IntPtr wParam, IntPtr lParam)
    {
        if (code < 0 || code == HC_NOREMOVE)
        {
            return Win32.CallNextHookEx(IntPtr.Zero, code, wParam, lParam);
        }

        Keys key = GetKeyFromWParam(wParam);
        Keys keyCombo = key | GetCurrentModifiers();
        var isKeyDownEvent = IsKeyDownEvent(lParam);

        var handled = stateMachine.Add(keyCombo, isKeyDownEvent);
        if (handled)
        {
            Win32.CallNextHookEx(IntPtr.Zero, code, wParam, lParam);
            return LResultHandled;
        }
        else
        {
            return Win32.CallNextHookEx(IntPtr.Zero, code, wParam, lParam);
        }
    }

    private static readonly IntPtr LResultHandled = new IntPtr(1);