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

时间:2011-04-15 06:44:44

标签: c++ windows winapi windows-7 aero-snap

如何使用Aero Snap feature确定窗口是否已调整大小? 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程序的预期行为。

1 个答案:

答案 0 :(得分:7)

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

您可以期待的最好的方法是在尺寸事件过程中检测到相反的边缘已被移动。您需要检查高度或宽度是否已更改为与移动事件区分开来。

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


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

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