【问题标题】:GetWindowPlacement gives the incorrect window positionGetWindowPlacement 给出了不正确的窗口位置
【发布时间】:2011-08-06 02:32:22
【问题描述】:

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

【问题讨论】:

  • GetClientRect 提供了什么?如果客户端大小大于窗口大小,那就是有问题的线索。 DWMWA_EXTENDED_FRAME_BOUNDS 怎么样?GetWindowRect cmets 中提到它有助于获取 Aero 窗口的边界?
  • 看起来可能是GetWindowRect too small on Windows 7的骗子
  • @ben 我的经验是 GetWindowRect 返回正确的值,但 GetWindowPlacement 是有问题的。

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


【解决方案1】:

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

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

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


cmets 揭示了有关您的问题的更多信息。您试图在应用关闭时保留应用的位置和大小,以便在重新启动时恢复它。您正在使用 GetWindowPlacement() 执行此操作,但发现当窗口的最后一个大小是 Aero Snap 时,它返回的位置不正确。

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

【讨论】:

  • 我不关心调整窗口大小的机制。我只想知道它现在的位置。
  • @Kirill 我认为如果您将问题从“如何确定窗口是否被“捕捉”?而是问:“为什么 GetWindowRect、GetWindowPlacement 等报告我的应用在 AeroSnap 之后的位置不正确”。
  • 嗯,内置应用程序(资源管理器、记事本等)由于 Aero Snap 而无法“记住”它们的位置。我认为这是因为它是临时将窗口放置在某个位置的便利功能。用户可能不希望为窗口记住捕捉的大小/位置。就像您不记得已最大化或最小化的窗口的大小/位置一样。您调用GetWindowPlacement 以获取窗口最大化或最小化之前的最后位置。我会为 Aero Snap 做同样的事情,而不是尝试编写代码来解决它。
  • @cody 不确定我是否同意。我喜欢记住的节目。
  • @David,快照和“正常”调整大小之间有一个很大的区别 - 当您“快照”时,您可以双击标题并将其恢复到其原始(恢复)位置。从这个意义上说,它更像是一个最大化。问题是,与最大化不同的是,WINDOWPLACEMENT 不会给您任何指示它处于此 Snap 状态。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-26
  • 1970-01-01
  • 2017-03-18
  • 2022-01-18
  • 2014-01-24
  • 1970-01-01
相关资源
最近更新 更多