GetWindowText vs Process.MainWindowTitle - PullRequest
0 голосов
/ 09 мая 2018

Я пытаюсь получить информацию о процессе для текущего активного приложения (или окна), используя .Net / C #.

В настоящее время я использую

[DllImport("user32.dll")]
private static extern IntPtr GetForegroundWindow();

Чтобы получить текущее активное окно. Я понимаю, что нет другого способа сделать это, кроме как использовать эту функцию API.

Из этого я использую:

[DllImport("user32")]
private static extern UInt32 GetWindowThreadProcessId(IntPtr hWnd, out Int32 lpdwProcessId);

Чтобы получить имя процесса, которое принадлежит этому окну, а затем я получаю дополнительную информацию о процессе.

Я также использую

[DllImport("user32.dll")]
private static extern int GetWindowText(IntPtr hWnd, StringBuilder text, int count);

Чтобы получить текущий текст или заголовок окна.

Теперь, используя класс Process, я могу использовать MainWindowTitle чтобы получить заголовок главного окна.

Дело в том, что MainWindowTitle и GetWindowText не возвращают одну и ту же информацию.

Например, скажем, главное открытое приложение - «Жаба» с подключением и открытым редактором. Затем с GetWindowText я получаю:

"Toad for Oracle - myConnection - Somequery.sql".

и Process.MainWindowTitle возвращает

"myConnection".

Итак, вопрос в том, как получить тот же текст, что и я, используя GetWindowText, но используя только классы .Net?

Edit: Я обнаружил, что на самом деле причина в том, что обе функции не запрашивают одинаковый дескриптор окна. Дескриптор окна, возвращенный в GetForegroundWindow, является номером 198982. И свойство MainWindowHandle, которое, я полагаю, является тем, которое используется в свойстве MainWindowTitle, является числом 198954. Используя Spy ++, я смог найти и подтвердить, что заголовки дескрипторов окон возвращены соответствующей функцией.

Таким образом, «проблема», если таковая имеется, заключается в том, что класс Process неправильно определяет самое переднее окно как главное окно.

1 Ответ

0 голосов
/ 09 мая 2018

GetForegroundWindow дает вам активное окно, в котором работает пользователь, и это может быть собственное окно или модальное диалоговое окно, не обязательно главное / корневое окно приложения.

MainWindow - это концепция .NET, в родном win32 такого нет, и в приложении может быть 0, 1 или несколько «главных окон».

Некоторые приложения Delphi / C ++ Builder имеют HWND для кнопки панели задач, и каждая форма является собственным окном, принадлежащим этому «невидимому» окну. Другие структуры пользовательского интерфейса могут выполнять аналогичные трюки, которые могут запутать обнаружение «основного окна».

Вы можете использовать UI Automation для проверки других приложений, если вы не хотите использовать p-invoke. Начните с окна переднего плана и поднимитесь по дереву собственных и дочерних окон ...

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