Прочитайте текстовое окно приложений, отличных от C #, используя Windows API из приложения C # Windows Forms - PullRequest
4 голосов
/ 10 августа 2011

У нас есть старое 32-битное приложение для Windows, написанное на C ++, которое делает некоторые вещи и отображает результаты в виде текстового поля.

Меня попросили написать приложение на C #, которое считывает данные изстарого приложения и последующей обработки данных.

Вопрос в том, как мне прочитать текстовое поле в старом приложении?

Кто-то сказал мне, что я могу получить «дескриптор» приложения, используяWindows API и пройти через элементы управления, а затем прочитать данные каждого из них!Это правда, и если да, то как мне сделать это из C #?

Это должно быть .Net 4 Windows Form Application.

Большое спасибо

Ответы [ 3 ]

4 голосов
/ 10 августа 2011

Вам, вероятно, придется использовать некоторые вызовы Interop для этого, в частности, используя комбинацию FindWindow / FindWindowEx и SendMessage & WM_GETTEXT / WM_GETTEXTLENGTH .

Вот статья на эту тему (в c ++, однако те же концепции просто нужно перенести для использования P / Invoke ), она немного устарела, но я считаю, Это должно быть очень важно для вашей ситуации.

1 голос
/ 10 августа 2011

Вы можете использовать приложение Spy ++ (поставляется с VisualStudio) для проверки вашего нативного приложения и найти имя класса элемента управления, который вы ищете.

Имея это, вы можете получить дескриптор главного окна вашего нативного приложения, которыйлегко, если вы отвечаете за запуск этого приложения из вашего приложения на c #:

...
var proc = Process.Start();
var mainWndHandle = proc.MainWindowHandle;

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

Если у вас есть все это, вы можете затем получить доступ к элементу управления textbox, используя FindWindowEx (а также вы можете использовать его для поиска главного окна, передав NULL как hwndParent).

И когда у вас есть дескриптор этого текстового поля, вы можете прочитать его содержимое, отправка сообщения из WM_GETTEXT .

Если вы не слишком много PInvoke'а, вы можете проверить http://pinvoke.net/ для справки о том, как вызвать WINAPIфункция из вашей программы на C #.

0 голосов
/ 10 августа 2011

Вам действительно нужен пользовательский интерфейс приложения C ++?Потому что будет очень неудобно иметь 2 отдельных интерфейса с разными модулями сообщений.Вам нужно будет синхронизировать этот беспорядок при обновлении значения.

Почему бы вам не удалить должным образом логический код из приложения C ++ и не представить его в проекте Interop CLR (C ++ / CLI)?Если вам не нужно добавлять дополнительные функции в приложение C ++, мне кажется, это очень просто

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...