将文本插入到另一个应用程序的文本框中。

12

我如何使用C#或C++向另一个应用程序的文本框中插入文本? 我很久以前做过这个,好像是使用应用程序的HWND。但自从那次更改后,每个应用程序实例都会更改,我觉得我不记得完整的故事了。我该怎么做?是否要获取正在运行的应用程序列表,提取所需的应用程序,然后从中获取HWND,然后...嗯...然后呢?

4个回答

17
使用FindWindowEx()查找句柄(HWND),然后使用SendMessage()发送WM_SETTEXT消息。
在使用FindWindowEx时,您需要先通过使用其类名找到主窗口句柄。然后,您需要找到文本框所在的任何容器的句柄,调用FindWindowEx,传递父级(窗口)的句柄和容器的类名。您需要重复此操作,直到到达文本框。您可以使用一个名为Spy++的工具,默认情况下与Visual Studio一起安装,检查目标应用程序并找出带有其类名的容器层次结构(API中所有对象都真正称为窗口,但我将它们称为容器以与顶级窗口形成对比)。

1
此外,您可能需要添加一个调用InvalidateRect的函数,因为SendMessage会更改它,我可以在Winspector中看到该值,但是我的表单上的值保持不变,因此InvalidateRect将导致重绘。 - Dean Hiller
如果应用程序包含多个文本框,我想从特定的文本框中读取数据,有没有办法区分文本框的处理程序? - MK446

3

然后是 SendMessage() 和 WM_SETTEXT。


1

不必针对特定应用程序,您可以直接向文本字段发送按键。

  private void button1_Click(object sender, EventArgs e)
    {
       System.Threading.Thread.Sleep(5000);
       SendKeys.Send(send_text);

    private void textBox1_TextChanged(object sender, EventArgs e)
    {
        send_text = textBox1.Text;            
    }

请附上一些解释。 - CodeWarrior
这个非常好用。非常感谢你的分享!我不敢相信它被踩了。拜托啦,大家不要因为它不是在你们的环境下最理想的解决方案就否定它的用处! - Jeff

0
你可以使用 ClipBoard 类来实现相同的功能。

但这将涉及用户处理而不是代码执行。 - RvdK

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接