Я хочу определить, свернуто/развернуто/ни одно окно, что обычно можно сделать несколькими разными способами:
IsIconic(hwnd)
GetWindowPlacement(hwnd).showCmd
(GetWindowLong(hwnd, GWL_STYLE) & WS_MINIMIZE) != 0
Но если окно не отвечает на сообщения (вы можете искусственно настроить это, например, с помощью PsSuspend от Sysinternals), все они перестают реагировать на изменения состояния окна (они продолжают сообщать о том же состоянии, в котором было окно, когда оно было приостановлено). есть ли API, который может справиться с этим случаем?
Но вы все равно можете свернуть и восстановить окна, когда они заморожены. Что-то должно отслеживать, видно ли окно или нет.
Тот факт, что ОС по-прежнему может взаимодействовать с замороженным окном в ограниченном объеме, не означает, что она предоставит вам доступ к любым внутренним данным, которые она использует для этого.
Окно, с которым вы можете взаимодействовать (сворачивать, перемещать и т. д.), когда программа зависла, на самом деле является совершенно другим окном; это «призрачное окно», которое имеет другой дескриптор окна и связано с другим exe-файлом и именем класса (dwm.exe, с именем класса «Призрак»). «Настоящее» окно скрыто, но продолжает сообщать об одном и том же положении/состоянии, пока не разморозится (включая заголовок; «(Не отвечает)» добавляется только к заголовку призрачного окна).
Я использовал IsHungAppWindow (возвращает true как для призрачного окна, так и для замороженного реального окна) вместе с (недокументированными; user32.dll) GhostWindowFromHungWindow(hwnd)
и HungWindowFromGhostWindow(hwnd)
, чтобы решить эту проблему; как только у вас есть дескриптор призрачного окна, вы можете получить его положение и состояние в обычном режиме.
AFAIK, другого API нет. Конечный автомат должен иметь возможность обновляться, но если поток, владеющий окном, заморожен, этого не произойдет.