c# - 无法使用 SendKeys 或 SendMessage 以编程方式粘贴非文本对象

标签 c# winapi clipboard

我正在使用 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") 在这些应用程序中似乎以不同的方式解释。关于如何让它工作的任何想法?

最佳答案

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

我已经使用全局钩子(Hook)做了一些类似于你过去所做的事情,而且效果很好。

可在以下位置找到简单易用的全局钩子(Hook)实现代码:

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

这不会干扰粘贴操作:)

关于c# - 无法使用 SendKeys 或 SendMessage 以编程方式粘贴非文本对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2329554/

相关文章:

c - 如何获取当前用户的用户名?

linux - 在 linux 中使用 cl1p.net 在线剪贴板的 shell 脚本 - 错误 (23) 写入正文失败

c# - 如果已经在单独的线程上,是否有必要使用异步开始/结束方法?

c# - (U)Int64 和 Decimal 的(伪)随机约束值的生成

c# - 如何在 Windows 中获取光标下的单词?

datetime - Win32 是否提供了 GetDateTimeFormat 来获取统一的日期时间字符串,类似于 GetDateFormat 和 GetTimeFormat?

java - 用java读取系统剪贴板数据

c# - 剪贴板监视器

c# - 以编程方式更改 SQL Server 设置

C# 是否有进入 TCP 套接字编程的简单方法?