如何获取挂起/无响应窗口的最小化/最大化状态?
解决无响应窗口的状态判断问题
常规的窗口状态判断API(IsIconic、GetWindowPlacement、GetWindowLong)在目标窗口进程挂起时会失效,原因是这些方法需要与目标进程交互(比如发送窗口消息),而挂起的进程无法处理请求,导致返回旧状态甚至卡住。
可以使用**DwmGetWindowAttribute** API来绕过这个问题,它直接从桌面窗口管理器(DWM)获取窗口状态,不依赖目标进程的响应——DWM独立维护所有窗口的显示状态,哪怕进程挂起,它也能准确返回当前的窗口状态。
使用示例(C++)
#include <dwmapi.h> #pragma comment(lib, "dwmapi.lib") DWMWINDOWSTATE GetUnresponsiveWindowState(HWND hwnd) { DWMWINDOWSTATE currentState = DWMWINDOWSTATE_NORMAL; HRESULT hr = DwmGetWindowAttribute(hwnd, DWMWA_WINDOW_STATE, ¤tState, sizeof(currentState)); // 兼容不支持DWM的系统(如Windows XP),回退到常规方法 if (FAILED(hr)) { if (IsIconic(hwnd)) { currentState = DWMWINDOWSTATE_MINIMIZED; } else if (IsZoomed(hwnd)) { currentState = DWMWINDOWSTATE_MAXIMIZED; } } return currentState; }
说明
DwmGetWindowAttribute通过DWMWA_WINDOW_STATE(属性值为7)获取DWMWINDOWSTATE枚举值,对应三种状态:DWMWINDOWSTATE_MINIMIZED:窗口最小化DWMWINDOWSTATE_MAXIMIZED:窗口最大化DWMWINDOWSTATE_NORMAL:窗口处于正常状态
- 该API支持Windows Vista及以上系统,若需兼容旧系统,可在调用失败时回退到常规判断方法。
内容的提问来源于stack exchange,提问作者blueorchid3
相关产品推荐
相关产品推荐

