Die Community zu .NET und Classic VB.
Menü

VB 5/6-Tipp 0334: X-Schaltfläche eines Formulars deaktivieren

 von 

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:

Schwierigkeitsgrad 2

Verwendete API-Aufrufe:

DrawMenuBar, GetMenuItemCount, GetSystemMenu, RemoveMenu

Download:

Download des Beispielprojektes [2,06 KB]

'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-VersionWin32sWin95Win98WinMEWinNT4Win2000WinXP
VB4
VB5
VB6

Hat dieser Tipp auf Ihrem Betriebsystem und mit Ihrer VB-Version funktioniert?

Ja, funktioniert!

Nein, funktioniert nicht bei mir!

VB-Version:

Windows-Version:

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