Как свернуть дескриптор окна другого приложения в системный трей? - PullRequest
2 голосов
/ 15 сентября 2010

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

this.Visibility = Visibility.Hidden;

А А пытается получить дескриптор окна B с помощью:

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

равно IntPtr.Zero.

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

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

1 Ответ

3 голосов
/ 16 сентября 2010

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

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

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

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

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

«Я хочу окно, которое соответствует нить. "

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

«Вот о чем я вас спрашиваю!»

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

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

Обратите внимание, что говорят: «Я ищу неиспользуемое окно верхнего уровня "является шаг вперед, но это все еще не однозначно идентифицировать окно. Там может быть множеством неиспользуемых окон верхнего уровня в процессе. Например, проводник как правило, имеет много верхнего уровня неизвестные окна. Там рабочий стол, панель задач, ваши открытые папки Windows, и имущественные ведомости. Если вы попросите «Неизвестное окно верхнего уровня Исследователь, какой вы хотите?

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

Тема также разработана в MSDN Q & A Получить главное окно :

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

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

...