Как свернуть дескриптор окна другого приложения в системный трей?

Экземпляр A пытается восстановить окно экземпляра B, но я не могу получить дескриптор окна B. Я думаю, проблема в том, что окно сворачивается B в системный трей, используя:

this.Visibility = Visibility.Hidden;

И A пытается получить дескриптор окна B, используя:

Process process = Process.GetCurrentProcess();
Process.GetProcessesByName(process.ProcessName).First().MainWindowHandle;

Что равно IntPtr.Zero.

Я также пытался получить дескриптор окна по имени класса с помощью Spy++, но имя класса имеет GUID для каждого экземпляра в следующем формате:

HwndWrapper[FileName.exe;;ad445199-cf93-48a4-bd24-2f97d54c8af8]

person Jader Dias    schedule 15.09.2010    source источник


Ответы (1)


Это потому, что то, что вы хотите, в основном не существует, а концепция MainWindowHandle — это грубое неправильное название, которое проникло в .Net Framework для вечной путаницы. Из может быть несколько (или ноль): Преобразование процесса в окно:

"У меня есть идентификатор потока. Как мне получить соответствующее окно?"

Вы можете использовать функцию EnumThreadWindows, чтобы получить все окна в потоке.

"Да, я знаю об EnumThreadWindows, но как мне получить окно, которое я хочу?"

Ну, ты еще не сказал, что хотел.

«Мне нужно окно, соответствующее потоку».

Но какой? Как вы будете выбирать среди всех окон?

— Вот о чем я тебя прошу!

Но вы еще не описали, что вы хотите.

"Я хочу окно, соответствующее теме. Почему вы не отвечаете на мой вопрос?"

Обратите внимание, что высказывание «Я ищу бесхозное окно верхнего уровня» — это шаг вперед, но оно по-прежнему не идентифицирует окно однозначно. В процессе может быть несколько бесхозных окон верхнего уровня. Например, проводник обычно имеет множество не принадлежащих ему окон верхнего уровня. Есть рабочий стол, панель задач, открытые окна папок и листы свойств. Если вы спросите «не принадлежащее» окно Проводника верхнего уровня, какое из них вы хотите?

Возможно, у людей сложилось впечатление, что существует способ однозначно указать «окно» для процесса, потому что объект System.Diagnostics.Process имеет свойство, называемое MainWindowHandle. Документация для этого свойства также ничего не делает, чтобы развеять это понятие. Я понятия не имею, как это свойство выбирает среди нескольких не принадлежащих ему окон верхнего уровня.

Эта тема также подробно описана в разделе вопросов и ответов MSDN Получить главное окно:

Вопрос Как найти главное окно процесса? Я пишу шпионский инструмент, и мне нужно получить главное окно (HWND) для процесса, чтобы я мог отправить ему сообщение, например WM_ACTIVATEAPP.

A Какое главное окно вы имеете в виду?

person Remus Rusanu    schedule 15.09.2010