Минимизируйте / восстанавливайте окна программно, пропуская эффект анимации - PullRequest
7 голосов
/ 21 мая 2011

Мне нужно выполнить несколько операций со списком окон (свернуть некоторые из них, восстановить другие), чтобы переключаться между двумя или более наборами окон одновременно.

Проблема с этими анимациямивы можете увидеть при сворачивании и восстановлении окна.Весь процесс выглядит ужасно со всеми этими анимациями, входящими и выходящими, вверх и вниз.
Однако я не могу отключить эти анимации, потому что это для других компьютеров, и я не хочу менять настройки других людей, плюс эти анимации на самом делеполезно, когда вы минимизируете / восстанавливаете только одно окно (т.е. когда ВЫ делаете это вручную), потому что вы можете видеть, что происходит, но для того, чтобы делать это программно в нескольких окнах одновременно, это нехорошо.

Ятекущее значение с помощью функции SendMessage для отправки сообщения WM_SYSCOMMAND с параметрами SC_MINIMIZE / SC_RESTORE.Я не знаю, есть ли другой способ.

Итак, вопрос:
Как я могу минимизировать / восстановить окно программно без эффекта анимации ??

PS: язык программированияне важный.Я могу использовать любой язык, необходимый для этого.

Ответы [ 3 ]

7 голосов
/ 22 мая 2011

SetWindowPlacement с SW_SHOWMINIMIZED или SW_RESTORE в зависимости от значения showCmd в WINDOWPLACEMENT обойти окно анимации. Я бы следил за функциональностью будущих версий ОС, хотя в документации ничего не говорится об анимации.

3 голосов
/ 22 мая 2011

Вы можете временно отключить анимацию и затем восстановить первоначальные настройки пользователя.

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 голосов
/ 21 мая 2011

Как насчет Скрыть> Свернуть> Показать?

...