获取暂停/无响应窗口的最小化/最大化状态

问题描述 投票:0回答:1

我正在确定窗口是否最小化/最大化/两者都没有,这通常可以通过几种不同的方式来完成:

  • IsIconic(hwnd)
  • GetWindowPlacement(hwnd).showCmd
  • (GetWindowLong(hwnd, GWL_STYLE) & WS_MINIMIZE) != 0

但是,如果窗口不响应消息(您可以使用 Sysinternals 的 PsSuspend 人为地进行设置),这些窗口都会停止响应窗口状态的更改(它们会继续报告窗口被挂起时的相同状态。)有没有API可以处理这种情况?

winapi
1个回答
0
投票

程序冻结时可以与之交互(最小化、移动等)的窗口实际上是一个完全不同的窗口;它是一个“幽灵窗口”,它具有不同的窗口句柄,并与不同的 exe 和类名(dwm.exe,类名“Ghost”)关联。 “真实”窗口被隐藏,但一直报告相同的位置/状态,直到它解冻(包括标题;“(未响应)”仅添加到幽灵窗口的标题中)。 我使用

IsHungAppWindow

(对于幻影窗口和冻结的真实窗口都返回 true)以及(未记录;user32.dll)

GhostWindowFromHungWindow(hwnd)
HungWindowFromGhostWindow(hwnd)
来解决这个问题;一旦你有了幽灵窗口的句柄,你就可以正常获取它的位置和状态。
    

© www.soinside.com 2019 - 2024. All rights reserved.