当通过 aero snap 调整窗口大小时,
User32.GetWindowPlacement(hWnd).rcNormalPosition
仍存储其原始矩形,而 User32.GetWindowRect
会受到影响。
由于 aero snap 似乎独立于
WINDOWPLACEMENT
,现在我们无法仅使用 user32.dll
收集实际放置的完整信息。因此,我想知道是否有办法获取窗口的航空捕捉状态,指示窗口是否停靠以及窗口停靠到哪一侧。
Shell 也不提供此信息。因此,本质上,系统不通过公共 API 提供任何给定窗口的 Aero Snap 状态。
snap 的引入需要保留一些额外的信息。我通过将窗口矩形与包含该窗口的监视器的工作区域矩形进行比较来检测窗口是否看起来被捕捉。如果它似乎被捕捉到边缘之一,我会将其与放置信息一起记录下来。创建窗口后,我首先恢复窗口位置,然后,如果我记录了捕捉状态,我会相应地更改窗口的大小和位置。
您可以区分已捕捉到显示器边缘的窗口和经过仔细调整大小并放置在那里的窗口,因为捕捉的窗口的矩形与窗口位置中的矩形不匹配。
这种方法在 Windows 7 中效果很好。我最近发现 Windows 10 为捕捉位置和大小增加了更多灵活性,并通过玩更多游戏来实现令人讨厌的隐形调整大小边框。所以我的检测代码并不总是识别捕捉的窗口,但这应该可以修复。
一些流行的软件(如主要浏览器)似乎记得它们被捕捉,我认为它们使用相同的方法。