Die Community zu .NET und Classic VB.
Menü

VB 5/6-Tipp 0400: Minimieren und Maximieren eines Fensters verhindern

 von 

Beschreibung 

Durch das Auswerten von Klicks auf in den den sogenannten Non-Clientbereich, lässt sich das Minimieren und Maximieren eines Fensters unterbinden. Darüber hinaus können anstatt dessen eigene Funktionen treten, es wird also ein nicht standardmäßig implenetiertes, neues Event geschaffen.

Dieser Tipp wurde am 23. September 2004 von Florian Rittmeier um weitere Konstanten ergänzt.

Schwierigkeitsgrad:

Schwierigkeitsgrad 2

Verwendete API-Aufrufe:

CallWindowProcA (CallWindowProc), GetSystemMenu, RemoveMenu, SetWindowLongA (SetWindowLong)

Download:

Download des Beispielprojektes [3,7 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: Beschriftungsfeld "Label1"


'Autor: Damian
'E-Mail: Andre@webmediaworld.de

Option Explicit

Private Declare Function RemoveMenu Lib "user32" (ByVal _
        hMenu As Long, ByVal nPosition As Long, ByVal wFlags _
        As Long) As Long

Private Declare Function GetSystemMenu Lib "user32" (ByVal _
        hwnd As Long, ByVal bRevert As Long) As Long

Const MF_BYPOSITION As Long = &H400&

Private Const HTMINBUTTON As Long = 8&
Private Const HTREDUCE As Long = HTMINBUTTON
Private Const HTMAXBUTTON As Long = 9&
Private Const HTZOOM As Long = HTMAXBUTTON

Private Button As Long

Private Sub Form_Load()
    Dim Handle As Long

    Handle = GetSystemMenu(Me.hwnd, False)
    Call RemoveMenu(Handle, 4, MF_BYPOSITION)
    Call RemoveMenu(Handle, 3, MF_BYPOSITION)

    Call Init(Me.hwnd)
End Sub

Private Sub Form_Unload(Cancel As Integer)
    Call Terminate(Me.hwnd)
End Sub

Public Sub NonClient_MouseMove(HitTest As Integer)
    Button = HitTest
End Sub

Public Sub NonClient_LeftMouseButton()
    'Maximier Button
    If Button = HTZOOM Then
        Call Maximize_Funktion
    End If
    
    'Minimier Button
    If Button = HTREDUCE Then
        Call Minimize_Funktion
    End If
End Sub

'Dieser Code wird ausgeführt wenn Prog Maximiert werden soll
Public Sub Maximize_Funktion()
    Label1.Caption = "Prog wird nicht maximiert."
End Sub

'Dieser Code wird ausgeführt wenn Prog Minimiert werden soll
Public Sub Minimize_Funktion()
    Label1.Caption = "Prog wird nicht minimiert."
End Sub
'---------- Ende Formular "Form1" alias Form1.frm  ----------
'--------- Anfang Modul "Module1" alias Module1.bas ---------


'Autor: Damian
'E-Mail: Andre@webmediaworld.de

Option Explicit
              
Private Declare Function SetWindowLong Lib "user32" Alias _
        "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex _
        As Long, ByVal dwNewLong As Long) As Long

Private Declare Function CallWindowProc Lib "user32" Alias _
        "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal _
        hwnd As Long, ByVal Msg As Long, ByVal wParam As _
        Long, ByVal lParam As Long) As Long

Private Const GWL_WNDPROC As Long = (-4&)
Private Const WM_DESTROY As Long = &H2&

Private Const WM_NCLBUTTONDOWN As Long = &HA1&
Private Const WM_NCMOUSEMOVE As Long = &HA0&

Private PrevWndProc As Long

Public Sub Init(hwnd As Long)
    PrevWndProc = SetWindowLong(hwnd, GWL_WNDPROC, AddressOf SubWndProc)
End Sub

Public Sub Terminate(hwnd As Long)
    Call SetWindowLong(hwnd, GWL_WNDPROC, PrevWndProc)
End Sub

Private Function SubWndProc(ByVal hwnd As Long, ByVal Msg As Long, _
    ByVal wParam As Long, ByVal lParam As Long) As Long
    
    If Msg = WM_DESTROY Then
        Call Terminate(Form1.hwnd)
    ElseIf Msg = WM_NCLBUTTONDOWN Then
        Call Form1.NonClient_LeftMouseButton
    ElseIf Msg = WM_NCMOUSEMOVE Then
        Call Form1.NonClient_MouseMove(Trim(wParam))
    End If
    
    SubWndProc = CallWindowProc(PrevWndProc, hwnd, Msg, wParam, lParam)
End Function
'---------- Ende Modul "Module1" alias Module1.bas ----------
'-------------- 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 3 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 Daniel Heiß am 12.06.2005 um 21:01

Das ist doch alles viel zu kompliziert. Wenn ich verhindern will, dass sich eine Form maximiert // minimiert, dann entfehrne ich entweder die Control-Boxen, oder ich benutze folgenden Code:

Private Sub Form_Resize()
me.windowstate = 0
End Sub

Ist doch viel einfacher, oder?

Kommentar von Joe am 08.06.2002 um 21:25

Warum läuft das Ding unter XP nicht ?

Kommentar von benny am 29.01.2002 um 17:53

schön und gut der trick bloß wie geht das nun das man mdi child's nicht minimieren kann ???