代码之家  ›  专栏  ›  技术社区  ›  Sanket

无法使用sendkeys或sendmessage以编程方式粘贴非文本对象

  •  2
  • Sanket  · 技术社区  · 14 年前

    我正在使用registerhotkey win32 API侦听ctrl_-v键组合,并使用wndproc方法处理此热键通知。现在,即使除了调用base.wndproc(ref mesg)之外,我没有在这个方法中执行任何操作,粘贴操作似乎没有传递到Windows,因此粘贴没有工作。我通过显式调用sendkeys(“^v”)获得了文本粘贴,但它不适用于非文本数据。我还尝试了sendmessage win32 API,如下所示

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

    但即使这样也不行。

    我不知道如何执行我的代码,然后让Windows执行图像、文件等的粘贴。任何帮助解决这一点都将非常及时和高度赞赏。

    更新:我发现问题在于生成粘贴命令的窗口没有恢复焦点。更正后,粘贴对记事本很有效。另外,我现在使用alt_shift_v作为热键,以避免与默认的粘贴命令发生冲突。因此粘贴非文本数据可以很好地工作。但是,将文本粘贴到Visual Studio和Office应用程序中不起作用。在这些应用程序中,sendkeys(“^v”)的解释方式似乎不同。你知道怎么做吗?

    3 回复  |  直到 14 年前
        1
  •  1
  •   omglolbah    14 年前

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

    我用全球钩子做了一些类似于你过去所做的事情,而且效果非常好。

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

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

    这不会干扰粘贴操作:)

        2
  •  0
  •   Timores    14 年前

    我认为您应该截取ctrl-v键消息(通过wndproc),根据需要执行操作,然后让base.wndproc处理键消息。您还可以处理onkeydown事件。 在WinForms中,可以将Form.KeyPreview设置为true,以便在子控件之前查看消息。

        3
  •  0
  •   Mattias S    14 年前

    注册热键不是解决方案,如果你只是想采取一些行动,然后传递消息。听起来您需要一个键盘挂钩(setwindowshookexpi)。