【发布时间】: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 来最大化或最小化。哪个确实设置了正确的状态。