【问题标题】:Unable to use SendKeys or SendMessage for programmatically pasting non-text objects无法使用 SendKeys 或 SendMessage 以编程方式粘贴非文本对象
【发布时间】:2010-02-26 20:51:35
【问题描述】:

我正在使用 RegisterHotKey Win32 API 来监听 Ctrl_V 组合键并使用 WndProc 方法来处理此热键通知。现在,即使除了调用 base.WndProc(ref mesg) 之外我没有在此方法中执行任何操作,粘贴操作似乎也没有传递到 Windows 上,因此粘贴不起作用。我设法通过显式调用 SendKeys("^V") 来粘贴文本,但它不适用于非文本数据。我还尝试了 SendMessage Win32 API,如下所示

SendMessage(foregroundWindowHandle, 0x302, 0, 0);

但即使这样也行不通。

我无法弄清楚如何执行我的代码,然后让 Windows 执行图像、文件等的粘贴。解决此问题的任何帮助都将非常及时和高度赞赏。

更新:我发现问题在于生成粘贴命令的窗口没有重新获得焦点。更正此问题后,Paste 在记事本上运行良好。另外,我现在使用 Alt_Shift_V 作为热键以避免与默认粘贴命令发生冲突。所以粘贴非文本数据可以正常工作。但是,无法将文本粘贴到 Visual Studio 和 Office 应用程序中。 SendKeys("^V") 在这些应用程序中似乎以不同的方式解释。知道如何让它发挥作用吗?

【问题讨论】:

  • 你在粘贴什么?也许前台窗口只接受文本?
  • 我不完全是在粘贴,我只是想将粘贴命令传递给最初生成它的窗口。对于图像,我尝试过使用 Explorer 和 MS Paint。我也尝试在 Windows 资源管理器中复制粘贴文件,但没有成功

标签: c# winapi clipboard


【解决方案1】:

注册一个全局钩子,而不是注册一个热键。

我已经使用全局挂钩来执行与您过去所做的类似的事情,并且效果很好。

一个简单方便的全局钩子实现的代码可以在以下位置找到:

http://www.codeproject.com/KB/cs/globalhook.aspx

这不会干扰粘贴操作:)

【讨论】:

  • 重新阅读您的问题我看到您可能想要在粘贴操作之前执行您的操作,在这种情况下我的建议没有帮助。我会留下它,以防它仍然有用:)
【解决方案2】:

我认为你应该拦截 Ctrl-V 键消息(通过 WndProc),做你需要的,然后让 base.WndProc 处理键消息。您还可以处理 OnKeyDown 事件。 在 WinForms 中,您可以将 Form.KeyPreview 设置为 true,以便在子控件之前查看消息。

【讨论】:

  • 谢谢蒂莫尔斯。正如我在问题本身中提到的那样,我正在调用 base.WndProc() 但粘贴仍然无法正常工作
【解决方案3】:

如果您只想执行一些操作然后传递消息,则注册热键不是解决方案。听起来您需要一个键盘挂钩(SetWindowsHookEx API)。

【讨论】:

  • 谢谢马蒂亚斯,我会调查的。但很可能为 Ctrl_V 添加一个钩子可能不起作用,因为我现在使用 Alt_Shift_V 作为热键。请查看更新后的问题
猜你喜欢
  • 2020-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多