如何在 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
而不是MoveWindow
。 SetWindowPlacement
采用WINDOWPLACEMENT
结构,允许同时设置位置/大小和showCmd
状态。
【讨论】:
以上是关于如何在 Windows 的最大化窗口上无缝调用 MoveWindow?的主要内容,如果未能解决你的问题,请参考以下文章
Python 如何获得一个Windows程序窗口,并在窗口里的当前