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