【问题标题】:Get text from another application从另一个应用程序获取文本
【发布时间】:2009-12-09 11:50:36
【问题描述】:

我想从另一个应用程序的文本框中检索文本。第二个应用程序的 ProcessName 是“TestTextBox”,TextBox 的名称是“textBox1”。

我的代码,返回空字符串:

[DllImport("user32.dll")]
static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, long wParam, [MarshalAs(UnmanagedType.LPStr)] StringBuilder lParam);

Process[] processes = Process.GetProcessesByName("TestTextBox");
foreach (Process p in processes)
{
    IntPtr pFoundWindow = p.MainWindowHandle;
    const int WM_GETTEXT = 0x0D;
    StringBuilder sb = new StringBuilder();
    IntPtr retVal = SendMessage(pFoundWindow, WM_GETTEXT, 100, sb);
    MessageBox.Show(sb.ToString());
}

【问题讨论】:

  • LINQ 仍然在我的待办事项列表中...另外,据我了解,LINQ 仅在 .NET 3.5 或更高版本下工作。但这段代码应该适用于所有类型的 Windows,包括那些拥有 .NET 2.0
  • 您希望如何使用 LINQ 对其进行优化?
  • Process.GetProcesses().Any(p => p.ProcessName.Contains(processName)); 或类似的东西。啊,没有意识到您使用的是 .NET 2!

标签: c# sendmessage


【解决方案1】:

什么是“另一个应用程序”?这是你在写的东西吗?它可以在另一台机器上运行吗?在另一个域?在另一个用户帐户下?目标应用程序、表单或文本框会改变吗?您需要应用程序之间的异步(即非阻塞)通信吗?

如果其中任何一个问题的答案是“是”,您应该考虑使用.Net Remoting。这可从 .Net 2.0 获得。

【讨论】:

  • 我还没有看到这个应用程序,它也可以用python或其他方式编写。感谢您提到.Net Remoting,我不知道。
【解决方案2】:

6 月份有人讨论了how to find the handle of a child control,也许这会有所帮助。

【讨论】:

    【解决方案3】:

    您在发布的代码中获得了主窗体的 WindowHandle,根据 MSDN,发送到窗体的 GETTEXT 消息应返回其标题。 如果您想从 TextBox 中获取文本,您应该将 TextBox 的 WindowHandle 作为第一个参数传递。

    【讨论】:

    • 如何获取TextBox的WindowsHandle?
    • Doc Brown 的评论应该可以帮到您,您可能必须枚举子窗口并找到一种方法来识别要从中获取文本的 TextBox。
    【解决方案4】:

    您可以像其他人提到的那样使用 Windows API,或者您可以使用像 AutoIt 这样的库,这可能会使任务更容易一些。不确定您的要求是什么。

    【讨论】:

    • 借助 Doc Brown 的链接,我设法使它工作,谢谢。 AutoIt 不是我想要的 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-27
    • 2017-08-22
    • 2019-03-06
    相关资源
    最近更新 更多