GetWindowPlacement给出了不正确的窗口位置

GetWindowPlacement gives the incorrect window position

本文关键字:窗口 位置 不正确 GetWindowPlacement      更新时间:2023-10-16

如何找出窗口是否使用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程序的预期行为。

AeroSnap只是窗口管理器发送给应用程序的另一种类型的调整大小。这样你就不会知道它是snap而不是其他类型的大小调整。

你所能期望的最好情况是在一个大小事件的过程中检测到相对的边被移动了。您需要检查高度或宽度更改为,以便将其与移动事件区分开来。

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


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

我自己的应用程序做完全相同的,我遇到了完全相同的问题。我使用的解决方案是调用GetWindowRect()来代替GetWindowPlacement()来获得窗口的位置和大小。你说这对你来说是失败的,这样的话我就不知道该怎么建议了。我必须说,我发现有点难以相信GetWindowRect()不返回正确的窗口矩形。