You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取挂起/无响应窗口的最小化/最大化状态?

解决无响应窗口的状态判断问题

常规的窗口状态判断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, &currentState, 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 19:59:57