繁体   English   中英

如何获得 window 的航空快照 state?

[英]How to get the aero snap state of a window?

当 window 通过 aero snap 调整大小时,User32.GetWindowPlacement(hWnd).rcNormalPosition 仍然存储其原始矩形,而 User32.GetWindowRect 受到影响。
由于 aero snap 似乎独立于 WINDOWPLACEMENT,现在我们无法仅使用 user32.dll 收集实际放置的完整信息。 因此,我想知道是否有办法获取 window 的 aero snap state,指示window 是否已停靠以及window 停靠在哪一侧

Aero Snap 是 Shell 的功能,而不是窗口系统。 因此,窗口系统无法提供该信息,因为它不知道这些状态。

Shell 也不提供此信息。 因此,从本质上讲,系统不会通过公共 API 提供任何给定 window 的 Aero Snap state。

我喜欢让我的主 windows 记住它们的所有位置信息,以便在它们重新启动时可以恢复。 在过去,保存 window 布局结构的副本并在重新创建 window 时将其设置回去就足够了。

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

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

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

一些流行的软件(如主流浏览器)似乎记得它们被抓拍过,我假设它们使用相同的方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM