4

I'd like to retrieve text from textbox in my another application. ProcessName from second application is 'TestTextBox', TextBox's name is 'textBox1'.

My code, which returns empty string:

[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());
}
sventevit
  • 4,766
  • 10
  • 57
  • 89
  • LINQ is still on my to-do list... Also, as I understand it, LINQ works only under .NET 3.5 or higher. But this code should work on all kind of Windows, including those who have .NET 2.0 – sventevit Dec 09 '09 at 11:58
  • How would you like to optimize it using LINQ? – Grzenio Dec 09 '09 at 11:58
  • `Process.GetProcesses().Any(p => p.ProcessName.Contains(processName));` or something along those lines. And ah, didn't realise you were using .NET 2! – Daniel May Dec 09 '09 at 12:13

4 Answers4

3

What is the "another application"? Is it something you are writing? Could it be running on another machine? In another domain? Under another user account? Could the target application, form, or textbox ever change? Do you need asynchronous (i.e. non-blocking) communication between applications?

If the answer to any of those questions is "yes", you should consider using .Net Remoting. This is available from .Net 2.0.

Dour High Arch
  • 21,513
  • 29
  • 75
  • 90
  • I didn't even saw this application yet, it could also be written in python or whatever. Thanks for mentioning .Net Remoting, I didn't knew it. – sventevit Dec 10 '09 at 07:14
1

You are getting the WindowHandle of the main Form in the code you posted, according to MSDN a GETTEXT message to a Form should return its title. If you want to get text from a TextBox you should be passing the WindowHandle of the TextBox as the first argument.

Kevin Wienhold
  • 331
  • 1
  • 4
1

In june there was a discussion of how to find the handle of a child control, perhaps this helps.

Community
  • 1
  • 1
Doc Brown
  • 19,739
  • 7
  • 52
  • 88
0

You could use Windows API like others have mentioned or you could use a library like AutoIt that might make the task a little easier. Not sure what your requirements are.

Cory Charlton
  • 8,868
  • 4
  • 48
  • 68
  • With Doc Brown's link I managed to make it work, thanks anyway. AutoIt isn't quite what I was looking for :) – sventevit Dec 11 '09 at 07:04