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