将粘贴消息发送到活动窗口的焦点控件
本文关键字:窗口 活动 焦点 控件 消息 | 更新日期: 2023-09-27 18:35:48
我想拦截一个热键(特别是CTRL V
),它将以某种方式与我的应用程序交互。我能够使用 RegisterHotKey
方法全局注册热键。当我按CTRL V
时,我希望焦点窗口/控件也接收WM_PASTE
消息。我尝试通过SendMessage
发送它,但它似乎不起作用。我最终取消注册了热键,将^v
发送到当前窗口,然后重新注册了热键。
private static void Hook_KeyPressed(object sender, KeyPressedEventArgs e)
{
_hook.KeyPressed -= Hook_KeyPressed;
_hook.Dispose();
SendKeys.Send("^v");
_hook = new KeyboardHook();
_hook.RegisterHotKey(global::ClipMaster.ModifierKeys.Control, Keys.V);
_hook.KeyPressed += Hook_KeyPressed;
}
这可以解决问题,但它会阻止鼠标(和窗口)大约半秒钟。我也担心它在某些应用程序中不起作用,尽管我不知道我可以举什么例子。
我不确定你想用这个钩子实现什么,因为从代码示例中无法理解它。
假设您出于审计原因(或某种监视)而这样做,我建议您查看WM_HOTKEY消息的返回值。它可以"说"消息没有被处理,因此允许其他逻辑(例如其他钩子)进一步处理 Ctrl-V。另外,我建议使用替代方法来重新发送 Ctrl-V,而不是具有已知计时问题的 SendKeys 类。您是否考虑过发布消息?
我还找到了钩子本身的替代方法,即使用较低级别的按键进行挂钩。
让我知道它是否有帮助。