如何在 Windows 的最大化窗口上无缝调用 MoveWindow?

Posted

技术标签:

【中文标题】如何在 Windows 的最大化窗口上无缝调用 MoveWindow?【英文标题】:How do I seamlessly call MoveWindow on a maximized window in Windows? 【发布时间】:2018-03-26 03:05:00 【问题描述】:

我有一个 C# 应用程序正在尝试创建 Windows's Snap 功能的可自定义版本。我主要使用原生函数MoveWindow 和ShowWindowAsync。我还使用GetWindowPlacement 来确定最大化/正常/最小化状态。

我可以无缝地将“正常”窗口捕捉到我的用户可定义的框架。窗口会立即捕捉到新的所需位置和大小。

问题是当我从最大化过渡到正常时。如果我只调用 MoveWindow,那么窗口会捕捉到我想要的位置和大小。然而,窗口仍然认为它是“最大化”的,这会导致尝试重新最大化失败。

但是,如果我调用ShowWindowAsync(wnd, SW_SHOWNORMAL),然后调用MoveWindow(wnd, x, y, width, height, true),它会导致最大化窗口动画到它的旧位置,然后捕捉到它的新位置。这是非常不和谐和不愉快的。尝试翻转呼叫顺序或使用ShowWindow 代替ShowWindowAsync 无济于事。

这个问题的答案可能是禁用动画。我还没有找到一个干净的方法来做到这一点。

【问题讨论】:

嗯,Aero Snap 不会最大化窗口。它只是一个使用 MoveWindow 的定位辅助工具,与最大化窗口的任何相似之处纯属偶然。无需 GetWindowPlacement 即可获得成功。 不完全正确!您可以使用 Win+Left 和 Win+Right 在左半边、右半边和“正常”之间循环。但是,您也可以使用 Win+Up 和 Win+Down 来最大化或最小化。哪个确实设置了正确的状态。 【参考方案1】:

找到解决方案!

解决方法是调用SetWindowPlacement 而不是MoveWindowSetWindowPlacement 采用WINDOWPLACEMENT 结构,允许同时设置位置/大小和showCmd 状态。

【讨论】:

以上是关于如何在 Windows 的最大化窗口上无缝调用 MoveWindow?的主要内容,如果未能解决你的问题,请参考以下文章

在 Windows 上打印 - 多个子窗口

shortcuts

win10窗口怎么调整大小

Python 如何获得一个Windows程序窗口,并在窗口里的当前

如何在 Qt 的 Mac OS X 工具窗口中删除最大化按钮

如何使用 c++ 和 opengl 在 mac 中创建窗口?