GetWindowText против Process.MainWindowTitle

Я пытаюсь получить информацию о процессе для текущего активного приложения (или окна), используя .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?

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

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

GetWindowText. С другой стороны, вы можете захотеть изучить Microsoft UI Automation вместо p-вызова about. Плюс он будет работать с WPF
MickyD 09.05.2018 01:55

Если посмотреть на исходный код ссылки, MainWindowTitle - это простой вызов метода p / invoke для GetWindowText - однако это возвращаемое значение, кэшированное в поле, которое, возможно, является причиной несоответствия.

Alex K. 09.05.2018 12:18

@AlexK. Моя главная забота по этому поводу - не злоупотреблять p-invoke и держать мое приложение .net в безопасности. Но если свойство MainWindowTitle просто переносит вызов той же функции GetWindowText, то я зря трачу время.

Craig Stevensson 09.05.2018 14:52

Вы можете увидеть это здесь: linksource.microsoft.com/#System/services/monitoring/…

Alex K. 09.05.2018 15:36
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
899
1

Ответы 1

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

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

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

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

«Некоторые приложения Delphi / C++ Builder имеют HWND для кнопки панели задач, и каждая форма является собственным окном, принадлежащим этому «невидимому» окну.» - обратите внимание, что такое поведение не является стандартным для современных приложений D / CB, работающих в Vista +. Только устаревшие приложения по-прежнему делают это. Vista изменила способ работы таких вещей, как Alt-Tab и панель задач, поэтому такие "трюки" больше не взаимодействуют с Windows.

Remy Lebeau 09.05.2018 05:53

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

Anders 09.05.2018 11:19

Вы, ребята, правы насчет поведения старых приложений, и да, Toad написан на Delphi. В его последней версии 2018 года он все еще ведет себя плохо. Одним из примеров является то, что значок панели задач не перемещается на соответствующий монитор при работе в мультимониторной настройке. Весь мой код отлично работает для всего, что я открыл на своей текущей рабочей станции, за исключением Toad, только для этого он возвращает другую заголовок окна.

Craig Stevensson 09.05.2018 14:51

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