最小化/恢复窗口以编程方式跳过动画效果

时间:2011-05-21 00:26:27

标签: windows winapi automation sendmessage windows-shell

我需要在一系列窗口上执行多项操作(最小化其中一些,恢复其他窗口),以便一次在两组或更多组窗口之间切换。

这个问题是在最小化和恢复窗口时可以看到的动画。所有这些动画进出,上下都是整个过程看起来很糟糕 但是,我无法禁用这些动画,因为这是针对其他计算机而我不想更改其他人的设置,而且当您最小化/恢复一个窗口时(例如,当您手动执行此操作时),这些动画实际上非常有用,因为您可以看到发生了什么,但是为了一次在几个窗口上以编程方式进行,这并不好。

我目前正在使用SendMessage函数发送带有参数WM_SYSCOMMAND / SC_MINIMIZE的{​​{1}}消息。我不知道是否还有其他办法。

所以,问题是:
如何在没有动画效果的情况下以编程方式最小化/恢复窗口?

PS:编程语言并不重要。我可以使用任何必要的语言来实现这一目标。

3 个答案:

答案 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)

如何隐藏>最小化>显示?