WinForms/C#: Close-Button deaktivieren

15. Dezember 2010

Manchmal ist es hilfreich, wenn man während der Ausführung eines Prozesses in seinem Programm den “Schließen”-Button der Anwendung deaktiviert. Direkt mit WinForms-Mitteln ist dies allerdings nicht möglich.

Daher bleibt nur der Weg über Win32-API-Funktionalität, wobei ein Aktivieren/Deaktivieren des Schließen-Buttons z.B. über folgendes Property “IsCloseButtonEnabled” erreicht werden kann:

   1: #region Win32 API Functions

   2:  

   3: private const int SC_CLOSE = 0xF060;  // ID des Schließen-Buttons

   4: private const int MF_ENABLED = 0x0;   // Wert, wenn Schließen-Button aktiv ist

   5: private const int MF_DISABLED = 0x2;  // Wert, wenn Schließen-Button inaktiv ist

   6:  

   7: [DllImport("user32.dll")]

   8: private static extern IntPtr GetSystemMenu(IntPtr hWnd, bool bRevert);

   9: [DllImport("user32.dll")]

  10: private static extern int EnableMenuItem(IntPtr hMenu, int wIDEnable, int wValue);

  11:  

  12: #endregion

  13:  

  14: #region Properties

  15:  

  16: private bool _isCloseButtonEnabled = true;

  17: private bool IsCloseButtonEnabled

  18: {

  19:     get { return _isCloseButtonEnabled; }

  20:     set

  21:     {

  22:         if(_isCloseButtonEnabled == value)

  23:             return;

  24:         _isCloseButtonEnabled = value;

  25:  

  26:         IntPtr sysMenu = GetSystemMenu(Handle, false);

  27:         EnableMenuItem(sysMenu, SC_CLOSE, value ? MF_ENABLED : MF_DISABLED);

  28:     }

  29: }

  30:  

  31: #endregion

Allerdings kann der Benutzer das Programm immer noch über die Taskleiste oder das Kontextmenü beenden. Daher sollte in jedem Fall zusätzlich eine ordnungsgemäße Behandlung des Closing-Events der Form vorhanden sein…

Weiterhin ist anzumerken, dass ein einmaliges Deaktivieren des Schließen-Buttons nicht ausreicht. Verändert man die Größe der Form, minimiert oder maximiert sie, so ist der Button auf einmal wieder aktiviert! Daher ist es notwendig, einen Handler auf das Resize-Event der Form zu registrieren und dort den Schließen-Button immer wieder zu deaktivieren, wenn dies notwendig ist (d.h., wenn z.B. der Prozess aktiv ist, bei dem der Schließen-Button deaktiviert sein soll).