2011-05-21 6 views
7

Necesito realizar varias operaciones en una lista de ventanas (minimizar algunas, restaurar otras) para alternar entre dos o más conjuntos de ventanas a la vez.Minimizar/restaurar ventanas omitiendo programáticamente el efecto de animación

El problema con esto son las animaciones que puede ver al minimizar y restaurar una ventana. Todo el proceso se ve terrible con todas esas animaciones entrando y saliendo, arriba y abajo.
No puedo, sin embargo, deshabilitar esas animaciones porque esto es para otras computadoras y no quiero cambiar la configuración de otras personas, además esas animaciones son realmente útiles cuando minimiza/restaura una ventana solamente (es decir, cuando USTED lo hace manualmente) porque puede ver lo que está sucediendo, pero hacerlo programáticamente en varias ventanas a la vez, no es agradable.

estoy currenlty usando la función SendMessage para enviar el mensaje WM_SYSCOMMAND con params SC_MINIMIZE/SC_RESTORE. No sé si hay otra manera.

Entonces, la pregunta:
¿Cómo puedo minimizar/restaurar una ventana programáticamente sin el efecto de animación?

PD: El lenguaje de programación no es importante. Puedo usar cualquier lenguaje que sea necesario para lograr esto.

+0

¿Has probado ShowWindow (SW_MAXIMIZE), ShowWindow (SW_RESTORE)? –

+0

@Simon, otro usuario sugirió eso, pero hace lo mismo que el mensaje 'WM_SYSCOMMAND' – GetFree

+0

SetWindowPlacement con SW_SHOWMINIZED ya que showCmd parece omitir la animación. Pero no puedo encontrar ninguna referencia sobre eso. –

Respuesta

5

SetWindowPlacement con SW_SHOWMINIMIZED o SW_RESTORE según sea apropiado para showCmd en WINDOWPLACEMENT parece pasar por alto animación de la ventana. Sin embargo, vigilaría la funcionalidad para futuras versiones del sistema operativo ya que la documentación no menciona nada acerca de la animación.

2

¿Qué le parece Ocultar> Minimizar> Mostrar?

+0

Pensé en eso. Desafortunadamente eso presenta un problema diferente. Cuando oculta una ventana, su botón de barra de tareas se elimina de la barra de tareas. Y luego cuando lo muestra, su botón de la barra de tareas se vuelve a colocar como el botón situado más a la derecha en la barra de tareas. Eso significa que deja un lío completo en el orden de los botones de la barra de tareas. – GetFree

2

Puede deshabilitar temporalmente las animaciones y restaurar la configuración original del usuario.

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 ... 
} 

Cuando se construye el supresor, recuerda la configuración original del usuario y apaga la animación. El destructor restaura la configuración original. Al usar un c'tor/d'tor, se asegura de que la configuración del usuario se restaure si su código de reorganización arroja una excepción.

Aquí hay una pequeña ventana de vulnerabilidad. En teoría, el usuario podría cambiar la configuración durante la operación, y luego volverá a bloquear la configuración original. Eso es extremadamente raro y no tan malo.

+0

Gracias por esto. Sin embargo, hay un par de cosas que tengo que arreglar. Intenté enviar [una edición] (http://stackoverflow.com/review/suggested-edits/7456370), pero fue rechazado (¿WTF ?!). – Paul

+0

@Paul: Tus ediciones me parecieron muy buenas. No estoy seguro de por qué fueron rechazados. Me adelanté y los rehice (en un estilo ligeramente diferente). –

+0

Genial, pero no corrigió el destructor. – Paul

Cuestiones relacionadas