2012-03-14 22 views
8

Me gustaría detectar cuándo se maximizará el formulario para guardar ciertas configuraciones (no relacionadas con el tamaño ni la posición) y modificar el tamaño y la posición un poco. ¿Hay una manera universal de hacerlo? He intentado capturar el mensaje WM_SYSCOMMAND como en this article. Funciona bien para maximizar desde el menú, mediante el botón Maximizar, pero no se activa cuando presiono la tecla WIN + UP. ¿Alguien sabe de una manera universal cómo atrapar el evento de maximización, incluido el caso con la pulsación de la tecla WIN + UP?¿Cómo detectar cuándo se está maximizando el formulario?

Gracias

+4

que puede manejar el 'WM_GETMINMAXINFO'. – kobik

+0

@kobik, gracias, pero el tamaño y la posición no son las únicas cosas que quiero hacer (mal ejemplo, lo sé). Realmente necesito detectar cuándo se maximizará la ventana y no puedo reconocerla en WM_GETMINMAXINFO. –

Respuesta

11

Usted puede utilizar el mensaje WM_GETMINMAXINFO para guardar el estado de la ventana y luego utilizar el mensaje WMSize para comprobar si se maximiza la ventana.

en usted forma declarar el manejador mesage de este modo:

procedure WMSize(var Msg: TMessage); message WM_SIZE; 

y mango de la siguiente manera:

procedure TForm57.WMSize(var Msg: TMessage); 
begin 
    if Msg.WParam = SIZE_MAXIMIZED then 
    ShowMessage('Maximized');  
end; 
+1

¿No apaga este fuego demasiado tarde? (* después de * el formulario está maximizado). – kobik

+1

@kobik, Sí, este mensaje se activa después de maximizar, el OP puede usar 'WM_GETMINMAXINFO' para guardar el estado y luego usar' WMSize' para verificar si la ventana se maximizó. – RRUZ

7

WIN + UP no genera WM_SYSCOMMAND mensajes, es por eso que no se puede capturarlos. Genera WM_GETMINMAXINFO, WM_WINDOWPOSCHANGING, WM_NCCALCSIZE, WM_MOVE, WM_SIZE y WM_WINDOWPOSCHANGED mensajes, sin embargo. Como dijo RRUZ, use WM_GETMINMAXINFO para detectar cuándo está a punto de comenzar una operación de maximización y WM_SIZE para detectar cuándo ha finalizado.

7

OMI, no se puede utilizar WM_GETMINMAXINFO a "detectar cuando una operación de maximizar es a punto de comenzar" como se indica @Remy.

En realidad, el único mensaje que puede es WM_SYSCOMMAND con Msg.CmdType=SC_MAXIMIZE o indocumentado SC_MAXIMIZE2 = $F032 - pero no es de ser enviado a través de Win+UP, o mediante el uso de ShowWindow(Handle, SW_MAXIMIZE) por ejemplo.

La única manera de que pudiera detectar que una ventana está a punto de ser maximizada es a través de WM_WINDOWPOSCHANGING que se dispara justo después de WM_GETMINMAXINFO:

type 
    TForm1 = class(TForm) 
    private 
    procedure WMWindowPosChanging(var Message: TWMWindowPosChanging); message WM_WINDOWPOSCHANGING; 
    end; 

implementation 

const 
    SWP_STATECHANGED = $8000; 

procedure TForm1.WMWindowPosChanging(var Message: TWMWindowPosChanging); 
begin 
    inherited; 
    if (Message.WindowPos^.flags and (SWP_STATECHANGED or SWP_FRAMECHANGED)) <> 0 then 
    begin 
    if (Message.WindowPos^.x < 0) and (Message.WindowPos^.y < 0) then 
     ShowMessage('Window state is about to change to MAXIMIZED'); 
    end; 
end; 
Cuestiones relacionadas