tag lib c winapi redirect minimize

lib - Win32 C API para redirigir minimiza la animación



tag lib jstl (3)

He visto a RocketDock redirigir la animación de minimizar en Vista para que las ventanas se minimicen en el dock, y tengo curiosidad de cómo se hizo esto. ¿La redirección de minimización real es redirigida al muelle o es algo así como un gancho para evitar que Windows minimice la ventana y RocketDock tiene una animación personalizada cuando se minimiza la ventana?


El miembro ptMinPosition de la estructura WINDOWPLACEMENT especifica las coordenadas de la ventana cuando está minimizada, por lo que la función SetWindowPlacement se puede usar para ese efecto. Pero algunas pruebas muestran que la ventana no debe tener un botón de barra de tareas para que funcione (es decir, no WS_EX_APPWINDOW ).

No sé cómo funciona RocketDock, pero creo que esto podría lograrse instalando un WH_CBT global WH_CBT y actuando sobre (estableciendo el estilo_ex y luego estableciendo las coordenadas minimizadas) la notificación HCBT_MINMAX .


Puede usar la función API de AnimateWindow y pasarla, por ejemplo, AW_HOR_POSITIVE | AW_VER_POSITIVE para obtener una animación diagonal.

Comenzaría con un gancho global capturando WM_SYSCOMMAND / SC_MINIMIZE, y usaría AnimateWindow para apuntar a la esquina superior derecha.

Si esto no proporciona el efecto deseado, el siguiente paso sería usar WM_PRINT / WM_PRINTCLIENT para obtener una copia de la ventana en un mapa de bits (creo que esto es lo que hace AnimateWindow internamente), luego ocultar la ventana y hacer mi propia animación .


Estoy trabajando en un proyecto de barra de tareas de múltiples monitores de código abierto llamado "OpenMMT". Recientemente descubrí (a través de muchos dolores de cabeza) cómo lograr esto.

La siguiente explicación supone que usted sabe cómo usar RegisterShellHookWindow.

En el procedimiento de ventana que recibirá los ganchos de shell, busque HSHELL_GETMINRECT.

Ahora, de aquí en adelante es donde tuve problemas. De acuerdo con MSDN, el miembro lparam pasado contiene un puntero a un objeto "SHELLHOOK". Lo cual es cierto, sin embargo, no pude hacerlo funcionar por el simple hecho de que el miembro "rc" de esa estructura, es un RECT que difiere de la estructura RECT real en los archivos de encabezado de Windows. El RECT en los archivos de encabezado usa LONG para sus miembros, como en este caso, queremos SHORT.

De todos modos, aquí hay un fragmento de cómo lo logré.

Estructuras para definir:

typedef struct { SHORT left; SHORT top; SHORT right; SHORT bottom; } REALRECT, *LPREALRECT; typedef struct { HWND hWnd; REALRECT rc; } DOCUMENT_ME_RIGHT_MICROSOFT, *LPDOCUMENT_ME_RIGHT_MICROSOFT;

Luego en el procedimiento de la ventana:

case HSHELL_GETMINRECT: { LPDOCUMENT_ME_RIGHT_MICROSOFT lpShellHook = (LPDOCUMENT_ME_RIGHT_MICROSOFT)lParam; // lpShellHook now contains all the info. If you want to change the location // of the animation, simply change the lpShellHook->rc members to point // to the right coordinates and then return TRUE; return TRUE; }

Al minimizar los programas de mi aplicación, encontré algunos casos en los que la animación volvería a ser la original. Resolví esto minimizándolos así:

void MinimizeApp(HWND hWnd) { SetForegroundWindow(hWnd); ShowWindowAsync(hWnd, SW_MINIMIZE); }

Si desea obtener más información sobre mi proyecto o si simplemente desea ver el origen, siéntase libre de hacerlo en https://github.com/Fafson/OpenMMT