如何获取窗口的气动捕捉状态?

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

当通过 aero snap 调整窗口大小时,

User32.GetWindowPlacement(hWnd).rcNormalPosition
仍存储其原始矩形,而
User32.GetWindowRect
会受到影响。

由于 aero snap 似乎独立于

WINDOWPLACEMENT
,现在我们无法仅使用 user32.dll 收集实际放置的
完整
信息。因此,我想知道是否有办法获取窗口的航空捕捉状态,指示窗口是否停靠以及窗口停靠到哪一侧。

windows winapi aero-snap
2个回答
1
投票
Aero Snap 是 Shell 的一项功能,而不是窗口系统的一项功能。因此,窗口系统无法提供该信息,因为它不知道这些状态。

Shell 也不提供此信息。因此,本质上,系统不通过公共 API 提供任何给定窗口的 Aero Snap 状态。


1
投票
我喜欢让我的主窗口记住所有的放置信息,以便在重新启动时可以恢复它。在过去,保存窗口放置结构的副本并在重新创建窗口时将其设置回来就足够了。

snap 的引入需要保留一些额外的信息。我通过将窗口矩形与包含该窗口的监视器的工作区域矩形进行比较来检测窗口是否看起来被捕捉。如果它似乎被捕捉到边缘之一,我会将其与放置信息一起记录下来。创建窗口后,我首先恢复窗口位置,然后,如果我记录了捕捉状态,我会相应地更改窗口的大小和位置。

您可以区分已捕捉到显示器边缘的窗口和经过仔细调整大小并放置在那里的窗口,因为捕捉的窗口的矩形与窗口位置中的矩形不匹配。

这种方法在 Windows 7 中效果很好。我最近发现 Windows 10 为捕捉位置和大小增加了更多灵活性,并通过玩更多游戏来实现令人讨厌的隐形调整大小边框。所以我的检测代码并不总是识别捕捉的窗口,但这应该可以修复。

一些流行的软件(如主要浏览器)似乎记得它们被捕捉,我认为它们使用相同的方法。

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