使用SetWindowPlacement更改窗口的恢复位置不适用于每个窗口

时间:2010-06-27 01:21:53

标签: c# winforms winapi interop

我正在使用SetWindowPlacement功能来(1)最大化和(2)更改桌面上外部窗口的恢复位置。但是当我在WinForm窗口上使用此命令时,似乎没有正确设置还原位置。 (我正在测试的WinForm窗口只是一个VS2008 WinForms应用程序运行而没有修改。)因此,例如,如果窗口处于恢复状态位于(0,0)并且我使用SetWindowPlacement来最大化它并将其恢复位置设置为(100,100),然后单击窗口的恢复按钮,它将恢复为(100,100)而不是(0,0)。实际上,窗口似乎首先恢复到我设置的位置,然后在以编程方式操作之前移回到其最后的恢复位置。我很困惑为什么只会在WinForm窗口上发生这种情况 - 我尝试使用的每个非WinForm窗口都能正确恢复到我用SetWindowPlacement指示的位置。

我知道继续下去并不多,但我想知道这里是否有人对于为什么会这样做有任何想法。感谢。

2 个答案:

答案 0 :(得分:4)

是的,这是设计的。 Form类跟踪恢复边界本身,这是必要的,因此它可以在重新创建窗口后正确地重新定位。 Windows窗体通常会在运行时重新创建窗口,以实现只能由CreateWindowEx()指定的属性的属性设置器。像ShowInTaskbar一样。

私有RestoreWindowBoundsIfNecessary()方法将窗口放回,它将在窗口恢复时运行。据我所知,恢复边界在窗口最小化或最大化之前被锁定。如果要在窗口最小/最大化时修改恢复位置,则必须使用MoveWindow将其移动到恢复窗口之后。应该产生一些闪烁。

答案 1 :(得分:0)

我可以通过在调度程序的稍后旋转中设置窗口的大小和位置来避免任何闪烁。然后,正如Hans所指出的那样,RestoreWindowBoundsIfNecessary将在恢复窗口时使用该大小和位置。

ng-show="!edit[id] && imageUrl"