Получить текст из другого приложения

Я хотел бы получить текст из текстового поля в моем другом приложении. Имя процесса из второго приложения - "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 ответа

Решение

В июне была дискуссия о том, как найти дескриптор дочернего элемента управления, возможно, это поможет.

Что такое "другое приложение"? Это то, что вы пишете? Может ли он работать на другой машине? В другом домене? Под другой учетной записью пользователя? Может ли целевое приложение, форма или текстовое поле когда-либо измениться? Вам нужна асинхронная (то есть неблокирующая) связь между приложениями?

Если ответ на любой из этих вопросов "да", вам следует рассмотреть возможность использования .Net Remoting. Это доступно из.Net 2.0.

В коде, который вы разместили, вы получаете WindowHandle основной формы, в соответствии с MSDN сообщение GETTEXT для формы должно возвращать свой заголовок. Если вы хотите получить текст из TextBox, вы должны передать WindowHandle TextBox в качестве первого аргумента.

Вы можете использовать Windows API, как уже упоминали другие, или использовать библиотеку, такую ​​как AutoIt, которая может немного облегчить задачу. Не уверен, каковы ваши требования.

Другие вопросы по тегам