我正在确定窗口是否最小化/最大化/两者都没有,这通常可以通过几种不同的方式来完成:
IsIconic(hwnd)
GetWindowPlacement(hwnd).showCmd
(GetWindowLong(hwnd, GWL_STYLE) & WS_MINIMIZE) != 0
但是,如果窗口不响应消息(您可以使用 Sysinternals 的 PsSuspend 人为地进行设置),这些窗口都会停止响应窗口状态的更改(它们会继续报告窗口被挂起时的相同状态。)有没有API可以处理这种情况?
程序冻结时可以与之交互(最小化、移动等)的窗口实际上是一个完全不同的窗口;它是一个“幽灵窗口”,它具有不同的窗口句柄,并与不同的 exe 和类名(dwm.exe,类名“Ghost”)关联。 “真实”窗口被隐藏,但一直报告相同的位置/状态,直到它解冻(包括标题;“(未响应)”仅添加到幽灵窗口的标题中)。 我使用
IsHungAppWindow
(对于幻影窗口和冻结的真实窗口都返回 true)以及(未记录;user32.dll)
GhostWindowFromHungWindow(hwnd)
和 HungWindowFromGhostWindow(hwnd)
来解决这个问题;一旦你有了幽灵窗口的句柄,你就可以正常获取它的位置和状态。