8

如何确定是否使用Aero Snap 功能调整了窗口大小?GetWindowPlacement函数给出最新的“恢复”窗口大小。我使用它如下:

WINDOWPLACEMENT wp = {};
wp.length = sizeof(WINDOWPLACEMENT);
::GetWindowPlacement( hWnd, &wp );

例如,它给出wp.rcNormalPosition = {top=208 bottom=520 left=152 right=510},当它应该是 {top=0 bottom=1920 left=152 right=510}

请注意,GetWindowRect给出完全相同的错误结果。那是我的错,GetWindowRect给出了正确的结果。

我需要在程序退出时保存窗口状态并在启动时加载它,所以我需要知道窗口是如何放置的。如何找出实际的窗口坐标?


好吧,我用notepad.exe(和一些其他标准的 Windows 组件)做了几个测试,它以同样的方式保存它的状态——它不记得它是否被“捕捉”了。所以我想这是 Windows 程序的预期行为。

4

1 回答 1

7

AeroSnap 只是窗口管理器发送到您的应用程序的另一种类型的调整大小。因此,您不会知道它是 snap 而不是任何其他类型的调整大小。

您可以期望的最好的结果是检测到在大小事件过程中对边已经移动。您需要检查高度或宽度是否更改为,以便将其与移动事件区分开来。

你没有被告知这是一个快照的原因是很难想象一个应用程序为什么会关心调整大小的机制是什么。


这些评论揭示了更多关于你的问题。您正在尝试在应用关闭时保留应用的位置和大小,以便在重新启动时恢复它。您正在GetWindowPlacement()这样做并且发现当窗口的最后尺寸是 Aero Snap 时它返回一个不正确的位置。

我自己的应用程序完全相同,我遇到了完全相同的问题。我使用的解决方案是调用GetWindowRect()代替GetWindowPlacement()来获取窗口位置和大小。你说这对你来说失败了,在这种情况下,我不知道该建议什么。我必须说我很难相信GetWindowRect()不返回正确的窗口矩形。

于 2011-04-15T07:07:52.570 回答