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

Kir*_*sky 7 c++ windows winapi windows-7 aero-snap

如何使用Aero Snap功能查明窗口是否已调整大小?GetWindowPlacementfunction提供最新的"恢复"窗口大小.我用它如下:

WINDOWPLACEMENT wp = {};
wp.length = sizeof(WINDOWPLACEMENT);
::GetWindowPlacement( hWnd, &wp );
Run Code Online (Sandbox Code Playgroud)

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

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

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


好吧,我用notepad.exe(以及一些其他标准的Windows组件)进行了几次测试,并以同样的方式保存其状态 - 它不记得它是否"被抢购".所以我认为这是Windows程序的预期行为.

Dav*_*nan 7

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

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

之所以没有被告知这是一个突发事件的原因是很难想象为什么应用程序会关心调整大小的机制.


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

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

  • @David,快照和"正常"调整大小之间有一个很大的区别 - 当你"捕捉"时,你可以双击标题并恢复到其原始(恢复)位置.从这个意义上说,它更像是一个最大化.问题是,与最大化不同,WINDOWPLACEMENT不会向您提供任何迹象表明它处于此Snap状态. (4认同)
  • @Kirill我认为如果你从"如何找出一个窗口是否被抢购"中改变它,你的问题会得到改善吗?而是问:"为什么GetWindowRect,GetWindowPlacement等报告AeroSnap后我的应用程序的位置不正确". (2认同)
  • 嗯,内置应用程序(资源管理器,记事本等)不会因为Aero Snap而"记住"它们的位置.我认为这是因为它是临时将窗户放置在某个位置的便利功能.用户可能不希望*为窗口记住捕捉的大小/位置.与您不记得已最大化或最小化的窗口的大小/位置相同.你调用`GetWindowPlacement`来获取窗口*的最后位置*之前它被最大化或最小化.我会为Aero Snap做同样的事情,而不是尝试编写代码来解决它. (2认同)
  • @cody不确定我同意.我喜欢要记住的节目. (2认同)