Сворачивать/восстанавливать окна программно, пропуская эффект анимации

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

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

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

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

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


person GetFree    schedule 21.05.2011    source источник
comment
Вы пробовали ShowWindow(SW_MAXIMIZE), ShowWindow(SW_RESTORE)?   -  person Simon Mourier    schedule 21.05.2011
comment
@Simon, это предложил другой пользователь, но это делает то же самое, что и сообщение WM_SYSCOMMAND   -  person GetFree    schedule 21.05.2011
comment
SetWindowPlacement с SW_SHOWMINIZED, поскольку showCmd, кажется, обходит анимацию. Но я не могу найти ссылку на это.   -  person Sertac Akyuz    schedule 21.05.2011
comment
@Сертак, вот и все! Ты нашел это. Опубликуйте это как ответ, чтобы я мог принять его. Спасибо!   -  person GetFree    schedule 22.05.2011


Ответы (3)



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

person NGLN    schedule 21.05.2011
comment
Я думал об этом. К сожалению, это создает другую проблему. Когда вы скрываете окно, его кнопка на панели задач удаляется с панели задач. А затем, когда вы показываете его, его кнопка на панели задач снова становится самой правой кнопкой на панели задач. Это означает, что вы оставляете полный беспорядок в порядке кнопок на панели задач. - person GetFree; 21.05.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, вы гарантируете, что пользовательские настройки будут восстановлены, если ваш код перестановки вызовет исключение.

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

person Adrian McCarthy    schedule 22.05.2011
comment
Спасибо за это. Однако мне пришлось сделать пару исправлений. Я попытался отправить редактирование, но оно было отклонено (WTF?!). - person Paul; 24.03.2015
comment
@Paul: Ваши правки мне в основном понравились. Я не уверен, почему они были отклонены. Я пошел дальше и переделал их (немного в другом стиле). - person Adrian McCarthy; 25.03.2015
comment
Круто, но вы не исправили деструктор. - person Paul; 25.03.2015
comment
@ user253751: согласен. Вы также не должны переопределять пользовательские настройки. Это было задумано как хакерский обходной путь. Я использовал RAII, чтобы убедиться, что изменение является временным, и признал окно уязвимости. - person Adrian McCarthy; 16.07.2020