2011-04-15 74 views
6

如何确定是否使用Aero Snap feature来调整窗口大小? GetWindowPlacement函数给出了最新的“恢复”窗口大小。我用它如下: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程序的预期行为。

+2

GetClientRect给出了什么?如果客户端大小大于窗口大小,这是一个线索,有什么不对劲。 “DWMWA_EXTENDED_FRAME_BOUNDS”,在GetWindowRect注释中提到,它有助于获得Aero窗口的界限吗? – 2011-04-15 15:15:22

+0

看起来可能是[GetWindowRect在Windows 7上太小]的愚蠢(http://stackoverflow.com/questions/3192232/getwindowrect-too-small-on-windows-7) – 2011-04-15 15:23:36

+0

@ben这是我的经验GetWindowRect返回正确的值,但GetWindowPlacement是有问题的。 – 2011-04-15 16:16:52

回答

7

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

您可以希望的最好的方式是检测到相对边缘在大小事件过程中被移动。您需要检查高度或宽度是否改变,以便将其与移动事件区分开来。

你不会被告知这很简单的原因是,很难想象为什么应用程序会关心调整大小的机制。


评论显示了更多关于您的问题。您正尝试在应用程序关闭时保留应用程序的位置和大小,以便在重新启动时进行恢复。您正在使用GetWindowPlacement()这样做,并发现当窗口的上次大小为Aero捕捉时,它会返回错误的位置。

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

+0

我不在乎机制是用来调整窗口的大小。我只想知道它的现在位置。 – 2011-04-15 07:34:15

+0

如果你想知道你的窗口在哪里,请调用'GetWindowRect()'。如果你想知道它已经移动了,那么听一下'WM_SIZE'。 – 2011-04-15 10:00:45

+2

@Kirill我认为你的问题会改进,如果你从“如何找出一个窗口是否被”折断“改变它?”而是问,“为什么要GetWindowRect,GetWindowPlacement等我的应用程序在AeroSnap之后报告错误的位置“ – 2011-04-15 14:44:17