【问题标题】:Use SendMessage in C# to perform a CTRL-C operation on a given handle在 C# 中使用 SendMessage 对给定句柄执行 CTRL-C 操作
【发布时间】:2011-02-03 13:20:57
【问题描述】:

在 Google Chrome 中,您只需打开对话框并在对话框上按 CTRL-C 即可检索 JavaScript 警报/对话框的文本。这会将对话框中的文本放入剪贴板。

我正在尝试使用SendMessage 发送 CTRL-C 以对 JavaScript 对话框的文本执行复制。我已经设法使用 SendInput 做到这一点,但不幸的是,如果窗口没有焦点,这可能会失败。

我曾尝试将 SendMessage 与 WM_COPY 消息一起使用,但这并不能满足我的需要。

如果有人在成功使用 SendMessage 之前完成此操作,我将非常感谢您的帮助。

【问题讨论】:

    标签: c# copy sendmessage copy-paste


    【解决方案1】:

    如果 WM_COPY 失败,您可以尝试几种方法...

    要伪造按键,您可以发送 WM_KEYDOWN 和 WM_KEYUP 消息。

    但是,您在消息中发送了什么?如果你发送一个“c”,那么这些消息中就没有办法让你通知应用程序 ctrl 也被按住了。

    您可以发送一个字符 0x03(这是 ctrl+c 实际生成的字符代码),但不能保证接收应用程序会将其解释为“ctrl+c”操作。

    为什么它不起作用?接收应用程序可能...

    • 忽略 WM_KEYDOWN 和 WM_KEYUP 并使用其他方式读取键盘(例如 GetAsyncKeyState 以查看某个键是否按下)
    • 处理 WM_KEYDOWN 和/或 WM_KEYUP 消息,但查找“c”,然后使用 GetAsyncKeyState() 或类似方法来检测处理消息时 ctrl 是否关闭。
    • 如果它没有输入焦点,它可能仍会忽略这些消息,或者更糟的是,处理这些消息,就好像它们是通过输入焦点窗口接收的一样。

    所以 - 试一试,但它可能不起作用。

    或者,如果 SendInput 有效,那么您可以将输入焦点强制到正确的控件 SendInput,然后将输入焦点恢复到其先前的位置。

    另一种方法(可能是最好的方法)是,如果它是您已知的对话框并且它包含静态文本字段,您可能只能在其上找到该子控件和 GetText(发送 WM_GETTEXT 消息),并避免完全使用剪贴板。 (或者,如果您需要剪贴板上的文本,请像这样获取它,然后自己将其放在剪贴板上)。这将避免欺骗应用程序提供文本,并回退到标准的 Windows 行为。

    【讨论】:

    • 感谢您的回复。我将尝试将 WM_KEYDOWN 和 WM_KEYUP 与 0x03 一起使用。请阅读我更新的问题以获取有关我正在尝试做什么的更多详细信息。不幸的是,WM_GETTEXT 不起作用,因为对话框没有显示文本。我尝试通过 Spy++ 访问它。我唯一能检索到的不是我要找的对话框的标题。
    【解决方案2】:

    尝试使用这些

    WM_CUT = 0x300
    WM_COPY = 0x301
    WM_PASTE = 0x302
    WM_CLEAR = 0x303
    

    作为 wmsg 参数,具体取决于您的操作。

    【讨论】:

    • 我在问题中提到我尝试了 WM_COPY。不幸的是,它不能满足我的需要。我需要能够通过 SendMessage 调用来执行击键。
    • @gtaborga:这是正确的答案。您只是没有将其发送到正确的窗口。
    【解决方案3】:

    由于问题有点模糊,您是在谈论发送 Ctrl+C 击键以终止进程,还是将选择复制到剪贴板。如果是前者,请在 SO 上查看此答案 herehere,这是在以前的场合询问过的,其中 OP 询问如何将 Ctrl+C 击键发送到 shell 进程以终止它。

    如果您说的是 Ctrl+C 用于将选择复制到剪贴板,那么在复制到剪贴板之前是否确实首先选择了选择就更加棘手了...

    如果我走错了角度,至少,请编辑您的问题以使其更清晰!

    【讨论】:

    • 对于这个问题的含糊之处,我深表歉意。我确实在尝试复制;但是,它是在 Google Chrome 中的 javascript 对话框的对话框内容上完成的。如果您只是选择了一个 Google Chrome 对话框并使用击键执行 CTRL-C,它实际上会复制对话框的整个文本。这就是我想要表现的。它要求不选择任何文本才能使其工作。只需执行击键即可。
    【解决方案4】:

    我知道这是一个古老的问题,但鉴于尚未得到令人满意的回答,请允许我为其他人提供帮助:

    SendMessage() 不是必需的。只需使用:

    System.Windows.Forms.SendKeys.SendWait("^(c)");
    

    如果你想粘贴:

    System.Windows.Forms.SendKeys.SendWait("^(v)");
    

    【讨论】:

    • 当然已经很久了。我还没有尝试过您的解决方案,但是从查看它看来,根据msdn.microsoft.com/en-us/library/…,它似乎要求您已经将注意力集中在窗口上。到目前为止,大多数解决方案似乎都需要这样做。我尝试过的 SendInput 也可以。感谢您的加入。我从没想过我会再次看到回复。 :)
    • 我意识到这个答案是古老的,但我想补充一点,Chrome 对SendKeys.SendWait("^c"); 没有反应我目前有这个问题并读到它在 chrome 上不起作用
    • SendMessage 可以将组合键发送到另一个应用程序,即使它已最小化。 SendKeys 就像在当前窗口中输入(不管它是什么),这是因为我投了反对票。
    猜你喜欢
    • 2013-06-21
    • 1970-01-01
    • 1970-01-01
    • 2018-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-12
    • 2018-12-28
    相关资源
    最近更新 更多