我正在使用SetWindowPlacement
函数可以 (1) 最大化和 (2) 更改外部窗口在桌面上的还原位置。但是当我在WinForm窗口上使用这个命令时,它似乎没有正确设置恢复位置。 (我正在测试的 WinForm 窗口只是一个无需修改即可运行的 VS2008 WinForms 应用程序。)因此,例如,如果窗口处于位于 (0, 0) 的恢复状态并且我使用 SetWindowPlacement
将其最大化并将其恢复位置设置为(100,100),然后单击窗口的恢复按钮,它将恢复到(0,0)而不是(100,100)。实际上,窗口似乎首先恢复到我设置的位置,然后移回到以编程方式操作之前的最后恢复位置。我很困惑为什么这种情况只会发生在 WinForm 窗口上 - 我尝试此操作的每个非 WinForm 窗口都会正确恢复到我用 SetWindowPlacement
指示的位置。
我知道这没什么可继续的,但我想知道这里是否有人对为什么会发生这种情况有任何想法。谢谢。
最佳答案
是的,这是设计使然。 Form 类会跟踪恢复边界本身,这是必要的,以便在重新创建窗口后可以正确地重新定位窗口。 Windows 窗体通常会即时重新创建窗口,以实现只能由 CreateWindowEx() 指定的属性的属性 setter 。就像 ShowInTaskbar 一样。
私有(private)的RestoreWindowBoundsIfNecessary()方法将窗口放回去,它将在窗口恢复时运行。据我所知,恢复边界在窗口最小化或最大化之前被锁定。如果您想在窗口最小/最大化时修改恢复位置,那么您必须在恢复窗口后使用 MoveWindow 将其移动到您想要的位置。应该产生一些闪烁。
关于c# - 使用 SetWindowPlacement 更改窗口的恢复位置并不适用于每个窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3126041/