Mittendrin.

Zurück

Flurfunk der eXperts.

Hier erfahren Sie mehr über eXperts, Technologien und das wahre Leben in der SDX.

WinForms/C#: Close-Button deaktivieren

15.12.201009:30 Uhr , Matthias Jauernig

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).

Tags: Dev

2 Kommentare

20.11.201221:46 Uhr
Anonym

Vielen Dank für den Tipp mit dem Resize-Event. Allerdings funktionierte es bei mir erst nachdem ich die Zeilen 22 und 23 WEGGELASSEN habe: 22: if(_isCloseButtonEnabled == value) 23: return;
Vielen Dank für diesen Code-Ausschnitt. Das war genau das was ich gesucht habe.

21.11.20128:12 Uhr
Matthias Jauernig

Hallo Anonym,

Das hängt davon ab, mit welchem Wert _isCloseButtonEnabled initial gesetzt wird. Wenn wie oben initial "true" zugewiesen wird, sollte es klappen, ansonsten könnte es Probleme geben. Generell ist der Vergleich des Wertes in Zeile 22 aber eher eine kleine Optimierung, die auch weggelassen werden kann.

Viele Grüße,
Matthias

Dein Kommentar wartet auf Freischaltung.

Artikel kommentieren

Zurück

Tag Cloud


Kontakt aufnehmen


Anrufen

Gerne beantworten wir Ihre Fragen in einem persönlichen Gespräch!


Kontakt aufnehmen

Schreiben Sie uns eine E-Mail mit Ihren Fragen und Kommentaren!