2011-01-04 9 views
8

¿Hay algún evento que se produce cuando se restaura una ventana en C# /. NET?¿Hay un evento planteado en C# cuando se restaura una ventana?

Me di cuenta de que hay un evento que se produce cuando se activa una ventana, pero no puedo encontrar un evento correspondiente para una ventana que se está restaurando, como desde un estado maximizado o minimizado.

+0

¿Qué quiere decir "restaurar"? – AlexCode

+0

¿Ha intentado utilizar el evento SizeChanged? http://msdn.microsoft.com/en-us/library/system.windows.frameworkelement.sizechanged.aspx – Jon

+1

al restaurar, ¿quiere decir cuándo se volvió a activar la aplicación (provenía del estado minimizado) desde la barra de tareas? –

Respuesta

2

Bastante inseguro. Tendría que controlar el evento SizeChanged y detectar si WindowState cambió de Minimized a Normal o Maximized a Normal. Source

+0

Restaurado también puede significar ir de maximizado a normal. – BobC

+0

Oh, por supuesto;) –

2

Puede comprobar de esta manera:

private void Form1_Resize(object sender, EventArgs e) 
{ 
    if (this.WindowState == FormWindowState.Minimized) 
    { 
     ... 
    } 
    else if .... 
    { 
    } 
} 
+0

buscando 'if (this.WindowState == FormWindowState.Maximized) {...}' en el evento 'Resize' es lo que estás buscando. –

+4

Eso no le dirá si el estado * cambió *, solo lo que es en el momento del cambio de tamaño. –

13

Si no les gusta usar la propiedad del formulario WindowState y no quieren tener que mantener en torno a una bandera que indica el estado anterior de la forma, que pueda lograr el mismo resultado en un nivel ligeramente inferior.

Tendrá que reemplazar procedimiento de ventana de su forma (WndProc) y espere a la WM_SYSCOMMAND message indicando SC_RESTORE. Por ejemplo:

protected override void WndProc(ref Message m) 
{ 
    const int WM_SYSCOMMAND = 0x0112; 
    const int SC_RESTORE = 0xF120; 

    if (m.Msg == WM_SYSCOMMAND && (int)m.WParam == SC_RESTORE) 
    { 
     // Do whatever processing you need here, or raise an event 
     // ... 
     MessageBox.Show("Window was restored"); 
    } 

    base.WndProc(ref m); 
} 
+0

Tenga en cuenta que de esta manera podría dejar de funcionar en futuras versiones de Windows y, por supuesto, no funcionará en Mono y tal vez CE –

+0

@SoMoS: No hay absolutamente ninguna razón para creer que esto dejaría de funcionar en una futura versión de Windows. A menos que se reescriba todo el marco de ventanas, esto funcionará perfectamente. Y en el caso de que eso ocurra, tendrá mucho más problemas de compatibilidad que esto. El .NET Framework P/invoca la mayoría de estas cosas bajo las cubiertas de todos modos. Debería funcionar bien en Windows CE; No sé acerca de Mono, pero la pregunta no indica la necesidad de tal apoyo. –

+1

Solo quería señalar que ir tan bajo es un poco contrario a la filosofía de .Net porque estás agregando una dependencia sobre el SO que podrías evitar.Y puede estar seguro de que Linux (y Mono) no admite ningún PInvoke (y CE no tiene un soporte completo). –

0

Comprobar:

private void Form1_Activated(Object o, EventArgs e) 
{ 
    if (this.WindowState == FormWindowState.Minimized) { 
     ... 
    } 
} 
+0

Este es un buen enfoque: funciona cuando se restaura desde un estado 'Minimizado', pero no funciona cuando se 'Maximiza'. – Neolisk

+0

Hay un método de Desactivar para manejar el máximo también en caso de que alguien más tropiece con esto. – rbuddicom

-2

Es bastante fácil de añadir:

public partial class Form1 : Form { 
    private FormWindowState mLastState; 
    public Form1() { 
     InitializeComponent(); 
     mLastState = this.WindowState; 
    } 
    protected override void OnClientSizeChanged(EventArgs e) { 
     if (this.WindowState != mLastState) { 
     mLastState = this.WindowState; 
     OnWindowStateChanged(e); 
     } 
     base.OnClientSizeChanged(e); 
    } 
    protected void OnWindowStateChanged(EventArgs e) { 
     // Do your stuff 
    } 

haga clic aquí winforms-windowstate-changed-how-to-detect-this?

1

Sé que esta pregunta es bastante viejo, pero funciona de esta manera:

public Form1() 
{ 
    InitializeComponent(); 
    this.SizeChanged += new EventHandler(Form1_WindowStateTrigger); 
} 

private void Form1_WindowStateTrigger(object sender, EventArgs e) 
{ 
    if (this.WindowState == FormWindowState.Minimized) 
    { 
     MessageBox.Show("FORM1 MINIMIZED!"); 
    } 

    if (this.WindowState == FormWindowState.Normal) 
    { 
     MessageBox.Show("FORM1 RESTORED!"); 
    } 

    if (this.WindowState == FormWindowState.Maximized) 
    { 
     MessageBox.Show("FORM1 MAXIMIZED!"); 
    } 
} 

El uso del evento SizeChanged, junto con una comprobación de WindowState funciona bien aquí.

+0

¡No considera el tamaño simple de hier! ¡Entonces necesita almacenar el último estado en alguna parte y evaluarlo como ofertas usr-local-ΕΨΗΕΛΩΝ! – Rekshino

0

La respuesta de Redhart es buena. Esto es lo mismo pero un poco más simple:

public Form1() 
{ 
    InitializeComponent(); 
    this.SizeChanged += Form1_SizeChanged; 
} 

#region Event-Handlers 
void Form1_SizeChanged(object sender, EventArgs e) 
{ 
    var state = this.WindowState; 
    switch (state) 
    { 
     case FormWindowState.Maximized: 
      ClearMyView(); 
      DisplayMyStuff(); 
      break; 
     case FormWindowState.Minimized: 
      break; 
     case FormWindowState.Normal: 
      ClearMyView(); 
      DisplayMyStuff(); 
      break; 
     default: 
      break; 
    } 
} 
#endregion Event-Handlers 
Cuestiones relacionadas