2012-09-04 32 views
10

Así que quiero instantáneamente, ya que esta parte del programa depende de la velocidad, activar una función cuando el estado de la ventana se cambia en mi forma principal. Necesito que sea algo como esto:¿Cómo disparo algo cada vez que WindowState cambia en C#?

private void goButton_Click(object sender, EventArgs e) 
{ 
    //Code 
} 

yo nos registramos en la pestaña de eventos de la forma, no tengo WindowStateChanged, etc. ¿Cómo se hace esto?

Se redimensionará mucho el formulario, por lo que no funcionará cuando cambie el tamaño.

+0

¿Por qué se redimensionaría mucho el formulario y cuál sería el rendimiento de un if (WindowState == x) 'relativo a la respuesta a un evento WindowStateChanged (si existiera)? – Mufaka

Respuesta

18

El evento Resize (o SizeChanged) se activará cuando cambie WindowState.


En una nota lateral, WPF sí incluye un evento para este StateChanged directamente.

+0

+1 Parece la mejor respuesta dada la API actual. – Mufaka

+0

¡Muchas gracias! ¿Alguien sabe una forma de disparar un evento cuando La ventana está flotando a un lado de la pantalla? (Haga clic en el título y arrastre la ventana al costado de la pantalla) El tamaño cambiado se disparará con seguridad, pero ¿hay algún campo o algo para obtener esa información? –

+0

@NoelWidmer Probablemente necesites usar las llamadas a la API de Windows para la funcionalidad win7 +. Sin embargo, no estoy seguro de lo que tendrían. –

0

Puede cambiar el estado de la ventana de un formulario desde otro hilo con esto. Esto funciona en .Net Framework 3.5

Invoke(new Action(() => { this.WindowState = FormWindowState.Normal; })); 

Espero que esto pueda ayudarlo.

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 
} 
} 
+0

Esto es útil para establecer la propiedad WindowState, pero creo que la pregunta era cómo atrapar el evento disparado después de que cambie. – funseiki

+0

Lo siento @funseiki. Tengo tu pregunta. Encontraré una respuesta pronto. –

1

Usted podría intentar anular la función WndProc como this link sugiere.

Desde el puesto de:

protected override void WndProc(ref Message m) 
{ 
    if (m.Msg == /*WM_SIZE*/ 0x0005) 
    { 
     if(this.WindowState == FormWindowState.Minimized) 
     { 
      // do something here 
     } 
    } 

    base.WndProc(ref m); 
} 

Este código sólo comprueba lo que el estado de forma es cuando se dispara un evento Resize.

Alternativamente, probablemente podría simplemente tomar el evento Resize del formulario y verificar el estado de la ventana desde allí. Pero oigo que no se dispara cuando se maximiza un control (¿o forma?).

Espero que esto ayude!

2

Espero que no sea demasiado tarde para la fiesta.

La manera que elegí para poner en práctica es bastante sencillo y no requiere la asignación de variables globales, sólo tiene que comprobar el valor de la forma WindowState antes y después de base.WndProc se llama:

protected override void WndProc(ref Message m) 
    { 
     FormWindowState org = this.WindowState; 
     base.WndProc(ref m); 
     if (this.WindowState != org) 
      this.OnFormWindowStateChanged(EventArgs.Empty); 
    } 

    protected virtual void OnFormWindowStateChanged(EventArgs e) 
    { 
     // Do your stuff 
    } 

En pocas palabras - que funciona.

Cuestiones relacionadas