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

C# 无法使用SendKeys或SendMessage以编程方式粘贴非文本对象,c#,winapi,clipboard,C#,Winapi,Clipboard,我正在使用RegisterHotKey Win32 API来侦听Ctrl\u V键组合,并使用WndProc方法来处理此热键通知。现在,即使除了调用base.WndProc(ref mesg)之外,我没有在这个方法中执行任何操作,粘贴操作似乎也不会传递到Windows上,因此,粘贴不起作用。我通过显式调用SendKeys(“^V”)成功地获得了文本粘贴,但它不适用于非文本数据。我还尝试了SendMessage Win32 API,如下所示 SendMessage(foregroundWindow

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

SendMessage(foregroundWindowHandle, 0x302, 0, 0);
但即使这样也行不通

我无法确定如何执行我的代码,然后让Windows执行图像、文件等的粘贴。任何解决此问题的帮助都将非常及时,我们将不胜感激


更新:我发现问题在于生成粘贴命令的窗口没有获得焦点。更正此问题后,“粘贴”对记事本工作正常。另外,我现在使用Alt_Shift_V作为热键,以避免与默认的粘贴命令冲突。因此,粘贴非文本数据效果良好。但是,将文本粘贴到VisualStudio和Office应用程序中并不起作用。SendKeys(“^V”)在这些应用程序中的解释方式似乎不同。你知道如何让它工作吗?

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

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

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

我已经使用了全局钩子来做一些类似于您过去所做的事情,并且效果非常好

有关简单方便的全局钩子实现的代码,请访问:


这不会干扰粘贴操作:)

您要粘贴到什么位置?也许前景窗口只接受文本?我不是完全粘贴,我只是尝试将粘贴命令传递给最初生成它的窗口。对于图像,我尝试了使用Explorer和MS Paint。我还尝试在Windows资源管理器中复制粘贴文件,但没有luckThanks Timores。正如我在问题本身中提到的,我正在调用base.WndProc(),但该粘贴仍然无法在Anks Mattias中运行,我将对此进行研究。但很可能为Ctrl\u V添加一个钩子可能不起作用,因为我现在使用Alt\u Shift\u V作为热键。请查看更新的问题重新阅读您的问题我知道您可能希望在粘贴操作之前执行操作,在这种情况下,我的建议没有帮助。我会保留它,以防它有用:)