将粘贴消息发送到活动窗口的焦点控件

本文关键字:窗口 活动 焦点 控件 消息 | 更新日期: 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 类。您是否考虑过发布消息?

我还找到了钩子本身的替代方法,即使用较低级别的按键进行挂钩。

让我知道它是否有帮助。