我需要在一系列窗口上执行多项操作(最小化其中一些,恢复其他窗口),以便一次在两组或更多组窗口之间切换。
这个问题是在最小化和恢复窗口时可以看到的动画。所有这些动画进出,上下都是整个过程看起来很糟糕 但是,我无法禁用这些动画,因为这是针对其他计算机而我不想更改其他人的设置,而且当您最小化/恢复一个窗口时(例如,当您手动执行此操作时),这些动画实际上非常有用,因为您可以看到发生了什么,但是为了一次在几个窗口上以编程方式进行,这并不好。
我目前正在使用SendMessage
函数发送带有参数WM_SYSCOMMAND
/ SC_MINIMIZE
的{{1}}消息。我不知道是否还有其他办法。
所以,问题是:
如何在没有动画效果的情况下以编程方式最小化/恢复窗口?
PS:编程语言并不重要。我可以使用任何必要的语言来实现这一目标。
答案 0 :(得分:7)
SetWindowPlacement
SW_SHOWMINIMIZED
SW_RESTORE
WINDOWPLACEMENT
适用于{{3}}中的showCmd
似乎绕过了窗口动画。我会关注操作系统未来版本的功能,因为文档没有提及有关动画的任何内容。
答案 1 :(得分:3)
您可以暂时停用动画,然后恢复用户的原始设置。
class WindowsAnimationSuppressor {
public:
WindowsAnimationSuppressor() : m_suppressed(false) {
m_original_settings.cbSize = sizeof(m_original_settings);
if (::SystemParametersInfo(SPI_GETANIMATION,
sizeof(m_original_settings),
&m_original_settings, 0)) {
ANIMATIONINFO no_animation = { sizeof(no_animation), 0 };
::SystemParametersInfo(SPI_SETANIMATION,
sizeof(no_animation), &no_animation,
SPIF_UPDATEINIFILE | SPIF_SENDCHANGE);
m_suppressed = true;
}
}
~WindowsAnimationSuppressor() {
if (m_suppressed) {
::SystemParametersInfo(SPI_SETANIMATION,
sizeof(m_original_settings),
&m_original_settings,
SPIF_UPDATEINIFILE | SPIF_SENDCHANGE);
}
}
private:
bool m_suppressed;
ANIMATIONINFO m_original_settings;
};
void RearrangeWindows() {
WindowsAnimationSuppressor suppressor;
// Rearrange the windows here ...
}
构造抑制器时,它会记住用户的原始设置并关闭动画。析构函数恢复原始设置。通过使用c'tor / d'tor,如果重新排列代码抛出异常,则确保恢复用户的设置。
这里有一个小漏洞窗口。理论上,用户可以在操作期间更改设置,然后您将重新关闭原始设置。这是非常罕见的,并不是那么糟糕。
答案 2 :(得分:2)
如何隐藏>最小化>显示?