【问题标题】:Minimize/restore windows programmatically skipping the animation effect以编程方式最小化/恢复窗口跳过动画效果
【发布时间】:2011-08-30 01:04:43
【问题描述】:

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

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

我正在使用SendMessage 函数发送带有参数SC_MINIMIZE/SC_RESTOREWM_SYSCOMMAND 消息。不知道有没有别的办法。

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

PS:编程语言并不重要。我可以使用任何必要的语言来完成此任务。

【问题讨论】:

  • 你试过 ShowWindow(SW_MAXIMIZE), ShowWindow(SW_RESTORE) 吗?
  • @Simon,另一个用户建议这样做,但它与WM_SYSCOMMAND 消息的作用相同
  • SetWindowPlacement 与 SW_SHOWMINIZED 作为 showCmd 似乎绕过动画。但我找不到这方面的参考。
  • @Sertac,就是这样!你找到了。将其发布为答案,以便我接受。谢谢!

标签: windows winapi automation sendmessage windows-shell


【解决方案1】:

SetWindowPlacementSW_SHOWMINIMIZEDSW_RESTORE 适合 showCmdWINDOWPLACEMENT 似乎绕过窗口动画。我会密切关注未来版本的操作系统的功能,因为文档没有提到任何关于动画的内容。

【讨论】:

    【解决方案2】:

    隐藏 > 最小化 > 显示怎么样?

    【讨论】:

    • 我想到了。不幸的是,这带来了一个不同的问题。隐藏窗口时,其任务栏按钮将从任务栏中删除。然后当你取消隐藏它时,它的任务栏按钮会被放回任务栏中最右边的按钮。这意味着您将任务栏按钮的顺序完全弄乱了。
    【解决方案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,您可以确保在重新排列代码引发异常时恢复用户的设置。

    这里有一个小的漏洞窗口。理论上,用户可以在操作过程中更改设置,然后你会猛烈地恢复原来的设置。这种情况极为罕见,而且还不算太糟糕。

    【讨论】:

    • 谢谢。不过,我必须修复一些问题。我尝试提交an edit,但被拒绝(WTF?!)。
    • @Paul:您的编辑在我看来大部分都很好。我不确定他们为什么被拒绝。我已经开始重做它们(风格略有不同)。
    • 酷,但你没有修复析构函数。
    • @user253751:我同意。您也不应该覆盖用户设置。这是一个 hacky 解决方法。我使用 RAII 来确保更改是暂时的,并承认漏洞窗口。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-20
    • 1970-01-01
    • 2010-09-09
    • 2017-04-17
    相关资源
    最近更新 更多