3

我想从另一个应用程序的文本框中检索文本。第二个应用程序的 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());
}
4

4 回答 4

3

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

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

于 2009-12-09T20:46:33.330 回答
1

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

于 2009-12-09T12:26:03.220 回答
1

六月有一个关于如何找到子控件句柄的讨论,也许这会有所帮助。

于 2009-12-09T12:30:51.073 回答
0

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

于 2009-12-10T19:46:07.273 回答