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

标签 c# winforms winapi interop

我正在使用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/

相关文章:

C# HttpWebRequest 验证/指定使用的密码

c# - 如何配置 Simple Injector 以在 ASP.NET MVC 中运行后台线程

C++:有没有办法以编程方式检查我的打印机是喷墨打印机还是激光打印机?

windows - Delphi 中的这些 Windows API 签名有什么区别?

c# - C# 加密库 hashlib 的实现是否正确

c# - 如何更改 foreach 迭代器引用的原始数据类型变量的值

c# - 在不窃取焦点的情况下显示表单?

c# - 匹配所有有效格式 IPv6 地址的正则表达式

C# WinForms 应用程序 : stop/interrupting a Windows Forms application

c++ - 如何过滤/区分 Windows API NotifyIpInterfaceChange() 捕获的实际事件和 "dummy"事件