我经常使用某种应用程序(它是闭源的,单线程的,32位的,本机的),它早于可配置的键绑定等细节。但它确实支持插件,所以我正在制作一个提供缺失功能的插件。
我使用SetWindowsHookEx
添加WH_KEYBOARD
挂钩。一些按键操作不变,其他按键被压缩并手动处理。对于后一种情况,我(正如documentation似乎建议)只返回1并忽略CallNextHookEx
的输出。这在大多数情况下都有效,但至少有一个案例 - Ctrl + D - 应用程序仍在处理,即使我告诉它不要。
我是否应该采取更多/不同的措施来压制击键?
也许相关:通常我会得到每封邮件的HC_NOREMOVE
和HC_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);