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