VB 5/6-Tipp 0334: X-Schaltfläche eines Formulars deaktivieren
von ActiveVB
Beschreibung
In der IDE läßt sich zwar wahlweise Min- und Max Button entfernen, um aber die X-Schaltfläche untauglich zu machen, muß auf die beiden anderen Titelleisten-Schaltflächen normalerweise verichtet werden. Dur den kleinen Trick, des "Schließen"-Eintrags-Entfernen im Systemmenü, kann die Schaltfläche zumindest deaktivieren werden.
Schwierigkeitsgrad: | Verwendete API-Aufrufe: | Download: |
'Dieser Quellcode stammt von http://www.activevb.de 'und kann frei verwendet werden. Für eventuelle Schäden 'wird nicht gehaftet. 'Um Fehler oder Fragen zu klären, nutzen Sie bitte unser Forum. 'Ansonsten viel Spaß und Erfolg mit diesem Source! '------------- Anfang Projektdatei Project1.vbp ------------- '--------- Anfang Formular "Form1" alias Form1.frm --------- ' Steuerelement: Schaltfläche "Command2" ' Steuerelement: Schaltfläche "Command1" Option Explicit Private Declare Function GetMenuItemCount Lib "user32" (ByVal _ hMenu As Long) As Long Private Declare Function GetSystemMenu Lib "user32" (ByVal hwnd _ As Long, ByVal bRevert As Long) As Long Private Declare Function RemoveMenu Lib "user32" (ByVal hMenu _ As Long, ByVal nPosition As Long, ByVal wFlags As Long) _ As Long Private Declare Function DrawMenuBar Lib "user32" (ByVal hwnd _ As Long) As Long Const MF_BYPOSITION = &H400 Const MF_REMOVE = &H1000 Private Sub Command1_Click() Call RemoveX Command1.Enabled = False End Sub Private Sub Command2_Click() Unload Me End Sub Private Sub RemoveX() Dim hMenu&, nPosition& Dim menuItemCount As Long hMenu = GetSystemMenu(Me.hwnd, 0) If hMenu Then nPosition = GetMenuItemCount(hMenu) Call RemoveMenu(hMenu, nPosition - 1, MF_REMOVE Or _ MF_BYPOSITION) Call RemoveMenu(hMenu, nPosition - 2, MF_REMOVE Or _ MF_BYPOSITION) Call DrawMenuBar(Me.hwnd) End If End Sub '---------- Ende Formular "Form1" alias Form1.frm ---------- '-------------- Ende Projektdatei Project1.vbp --------------
Tipp-Kompatibilität:
Windows/VB-Version | Win32s | Win95 | Win98 | WinME | WinNT4 | Win2000 | WinXP |
VB4 | |||||||
VB5 | |||||||
VB6 |
Ihre Meinung
Falls Sie Fragen zu diesem Artikel haben oder Ihre Erfahrung mit anderen Nutzern austauschen möchten, dann teilen Sie uns diese bitte in einem der unten vorhandenen Themen oder über einen neuen Beitrag mit. Hierzu können sie einfach einen Beitrag in einem zum Thema passenden Forum anlegen, welcher automatisch mit dieser Seite verknüpft wird.
Archivierte Nutzerkommentare
Klicken Sie diesen Text an, wenn Sie die 13 archivierten Kommentare ansehen möchten.
Diese stammen noch von der Zeit, als es noch keine direkte Forenunterstützung für Fragen und Kommentare zu einzelnen Artikeln gab.
Aus Gründen der Vollständigkeit können Sie sich die ausgeblendeten Kommentare zu diesem Artikel aber gerne weiterhin ansehen.
Kommentar von elexis am 02.04.2005 um 22:16
Liegt vllt. daran dass du das aus einem Modul(etc) heraus aufrufst und nicht aus dem/r Form selbst. Du müsstest das hwnd dann in die Prozedur übergeben.
Kommentar von Norbert am 17.08.2004 um 08:47
Wenn ich dieses Programm zum Deaktivieren des Schließen-Button einer Form anwende, erhalte ich eine Fehlermeldung:
Methode oder Datenobjekt nicht gefunden!
Dabei bezieht sich die Fehlermeldung auf die .hwnd-Eigenschaft! hMenu = GetSystemMenu(Me.hwnd, 0)
Was kann ich da tun?
Kommentar von Uwe am 12.05.2004 um 15:55
Wenn ich dieses Programm zum Deaktivieren des Schließen-Button einer Form anwende, erhalte ich eine Fehlermeldung:
Methode oder Datenobjekt nicht gefunden!
Dabei bezieht sich die Fehlermeldung auf die .hwnd-Eigenschaft! hMenu = GetSystemMenu(Me.hwnd, 0)
Was kann ich da tun?
Kommentar von Marc Ermshaus am 28.12.2003 um 16:40
Siehe auch Tipp 236.
Kommentar von Franz Grillmeier am 20.05.2003 um 13:29
Nur der Vollständigkeit halber:
Die Befehle:
hMenu = GetSystemMenu(Me.hwnd, -1)
Call DrawMenuBar(Me.hwnd)
aktivieren "X" wieder!
(Ich hab es durch ausprobieren rausgebracht!)
Kommentar von Daniel am 15.03.2003 um 19:46
Hallo
Ja ich hab ein problem :-) Das X wird bei mir zwar als deaktiviert dargestellt, allerdings woird bei einem Klick darauf das Fenster immernoch geschlossen.
hab das ganze in einem modul
Public Sub RemoveX(formhwnd)
Dim hMenu&, nPosition&
Dim menuItemCount As Long
hMenu = GetSystemMenu(formhwnd, 0)
If hMenu Then
nPosition = GetMenuItemCount(hMenu)
Call RemoveMenu(hMenu, SC_CLOSE, MF_BYCOMMAND)
Call DrawMenuBar(formhwnd)
End If
Kommentar von vocaris am 18.12.2002 um 22:45
Hallo,
würde ich gerne mit ...
Const SC_CLOSE = &HF060
Call DeleteMenu(hMenu, SC_CLOSE, MF_BYCOMMAND)
... machen, aber leider kenne ich den Wert von MF_BYCOMMAND nicht. Welche Wete neben SC_CLOSE gibt es noch?
gruß
vocaris
Kommentar von RoadRunner am 19.06.2002 um 08:45
Weiss jemand wie man das X später auch wieder hinkriegt?
Kommentar von Eliminator 2001 am 17.10.2001 um 15:00
Das geht auch wesentlich einfacher:
Private Sub Form_Unload(Cancel As Integer)
Cancel = 1
End Sub
Beim Schließen des Fenster wird der Vorgang einfach abgebrochen.
Ist wesentlich einfacher und sparrt dadurch, dass es keine DLLs aufruft, auch noch Resourcen.
see you,
Eliminator 2001
Kommentar von Goetz Reinecke am 21.06.2001 um 00:58
Hallo Rudi, Du kannst den Eintrag auch nach Commando, nicht wie hier nach EintragsNr löschen:
Const SC_CLOSE = &HF060
Call DeleteMenu(hMenu, SC_CLOSE, MF_BYCOMMAND)
Grüße
Götz
Kommentar von Rudi am 10.06.2001 um 09:37
Tip funktioniert nur, wenn "Schließen" auch der letzte Eintrag im Systemmenü ist.
Mit so einem netten Tool wie "TraySaver" erscheint leider nach "Schließen" noch ein Menüpunkt.
Dann muss man die Zahl entsprechend anpassen.
Kommentar von Götz Reinecke am 01.03.2001 um 21:12
Hallo Moosi, mhm damit könnten wir bestimmt mal wieder einen langen Thread im Forum füllen ;-)
Ich mein nämlich, daß Form nicht von "die Form" (Gestalt etc.) kommt, sondern von Formular. Naja, seis drum.
Grüße
Götz
Kommentar von Moosi am 01.03.2001 um 19:02
X-Button eines Forms deaktivieren;
kleiner Rechtschreibfehler: eines Forms -- einer Forms mfg,Moosi