抑制的键盘消息不会消失

时间:2015-01-11 17:32:19

标签: winapi

我经常使用某种应用程序(它是闭源的,单线程的,32位的,本机的),它早于可配置的键绑定等细节。但它确实支持插件,所以我正在制作一个提供缺失功能的插件。

我使用SetWindowsHookEx添加WH_KEYBOARD挂钩。一些按键操作不变,其他按键被压缩并手动处理。对于后一种情况,我(正如documentation似乎建议)只返回1并忽略CallNextHookEx的输出。这在大多数情况下都有效,但至少有一个案例 - Ctrl + D - 应用程序仍在处理,即使我告诉它不要。

我是否应该采取更多/不同的措施来压制击键?

也许相关:通常我会得到每封邮件的HC_NOREMOVEHC_ACTION版本,但对于Ctrl + D,我只会获得HC_ACTION版本。

C#来源:

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

0 个答案:

没有答案