2009-10-26 13 views
25

Jak wykryć zamknięcie formularza okna? Na przykład, w jaki sposób mogę sprawdzić, czy użytkownik kliknął przycisk zamykający formularz, czy też użytkownik kliknął znak "X" w prawym górnym rogu? Dziękuję Ci.Wykryj przyczynę zamknięcia formularza

Aktualizacja:

Zapomniałem wspomnieć, że przycisk wywołuje metodę Application.Exit().

Odpowiedz

35

Jak bashmohandes i Dmitriy Matveev już wspomniano, rozwiązanie powinno być FormClosingEventArgs. Ale, jak powiedział również Dmitriy, nie miało to żadnego znaczenia między twoim przyciskiem a X w prawym górnym rogu.

Aby rozróżnić te dwie opcje, można dodać do formularza właściwość boolowską ExitButtonClicked i ustawić ją na wartość true w przycisku Kliknij zdarzenie tuż przed wywołaniem Application.Exit().

Teraz możesz zapytać tę właściwość w zdarzeniu FormClosing i rozróżnić te dwie opcje w ramach sprawy

Przykład:

public bool UserClosing { get; set; } 

    public FormMain() 
    { 
     InitializeComponent(); 

     UserClosing = false; 
     this.buttonExit.Click += new EventHandler(buttonExit_Click); 
     this.FormClosing += new FormClosingEventHandler(Form1_FormClosing); 
    } 

    void buttonExit_Click(object sender, EventArgs e) 
    { 
     UserClosing = true; 
     this.Close(); 
    } 

    void Form1_FormClosing(object sender, FormClosingEventArgs e) 
    { 
     switch (e.CloseReason) 
     { 
      case CloseReason.ApplicationExitCall: 
       break; 
      case CloseReason.FormOwnerClosing: 
       break; 
      case CloseReason.MdiFormClosing: 
       break; 
      case CloseReason.None: 
       break; 
      case CloseReason.TaskManagerClosing: 
       break; 
      case CloseReason.UserClosing: 
       if (UserClosing) 
       { 
        //what should happen if the user hitted the button? 
       } 
       else 
       { 
        //what should happen if the user hitted the x in the upper right corner? 
       } 
       break; 
      case CloseReason.WindowsShutDown: 
       break; 
      default: 
       break; 
     } 

     // Set it back to false, just for the case e.Cancel was set to true 
     // and the closing was aborted. 
     UserClosing = false; 
    } 
+2

Oliver, teraz masz poważny błąd. Jeśli wywołasz Application.Exit z obsługi kliknięcia, gdy bliski powód będzie CloseReason.ApplicationExitCall i jeśli (UserClosing) stan będzie bezużyteczny. Powinieneś wywołać metodę To.Close() w module obsługi kliknięcia, aby dopasować przypadek przełącznika UserClosing lub musisz przenieść instrukcję na zewnątrz instrukcji switch. – okutane

+0

Jeśli formularz nie zostanie zamknięty, gdy będziesz w Form1_FormClosing - być może istnieje "czy chcesz wyjść?" pytanie - coś musi ustawić zmienną flag UserClosing na false lub następnym razem może być fałszywa. –

4

Możesz sprawdzić właściwość CloseReason formularza FormClosingEventArgs w module obsługi zdarzeń FormClosing, aby sprawdzić niektóre z możliwych przypadków. Przypadki opisane przez Ciebie będą jednak nieodróżnialne, jeśli będziesz korzystać z tej właściwości. Będziesz musiał napisać jakiś dodatkowy kod w module obsługi zdarzeń kliknięcia swojego przycisku "zamknij", aby zapisać pewne informacje, które będą sprawdzane w module obsługi zdarzeń FormClosing, aby rozróżnić te przypadki.

0

Trzeba dodać detektor do Even FormClosing, który wysyła w przypadku args właściwość typu CloseReason która jest jedną z tych wartości

// Summary: 
//  Specifies the reason that a form was closed. 
public enum CloseReason 
{ 
    // Summary: 
    //  The cause of the closure was not defined or could not be determined. 
    None = 0, 
    // 
    // Summary: 
    //  The operating system is closing all applications before shutting down. 
    WindowsShutDown = 1, 
    // 
    // Summary: 
    //  The parent form of this multiple document interface (MDI) form is closing. 
    MdiFormClosing = 2, 
    // 
    // Summary: 
    //  The user is closing the form through the user interface (UI), for example 
    //  by clicking the Close button on the form window, selecting Close from the 
    //  window's control menu, or pressing ALT+F4. 
    UserClosing = 3, 
    // 
    // Summary: 
    //  The Microsoft Windows Task Manager is closing the application. 
    TaskManagerClosing = 4, 
    // 
    // Summary: 
    //  The owner form is closing. 
    FormOwnerClosing = 5, 
    // 
    // Summary: 
    //  The System.Windows.Forms.Application.Exit() method of the System.Windows.Forms.Application 
    //  class was invoked. 
    ApplicationExitCall = 6, 
} 
+1

Oba przypadki opisane przez Nate będzie CloseReason.UserClosing, tak jak korzystanie z tej nieruchomości może mu pomóc? – okutane