Rubrik: Oberfläche · Menüs | VB-Versionen: VB5, VB6 | 10.04.01 |
Systemmenü modifizieren Einträge aus dem Systemmenü entfernen und/oder neue Einträge dem Systemmenü hinzufügen. | ||
Autor: Dieter Otter | Bewertung: | Views: 14.594 |
www.tools4vb.de | System: Win9x, WinNT, Win2k, WinXP, Win7, Win8, Win10, Win11 | Beispielprojekt auf CD |
Das nachfolgende Beispiel zeigt, wie man neue Einträge dem Systemmenü eines Formulars hinzufügen kann. Das Ausführen einer bestimmten Aktion nach dem Klicken auf einen dieser neuen Einträge setzt Subclassing voraus, d.h. die Windows-Systemmeldung muß von Ihrer Anwendung entsprechend "abgefangen" und ausgewertet werden.
Im nachfolgenden Beispiel wird der Standard-Eintrag "Maximieren" entfernt und zwei neue Einträge ans Ende der Menüeinträge angehängt - (www.vbarchiv.de und Info...).
' zunächst die benötigten API-Deklarationen ' Der nachfolgende Code muß in ein Modul eingefügt werden 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 Declare Function SetWindowLong Lib "user32" _ Alias "SetWindowLongA" ( _ ByVal hWnd As Long, _ ByVal nIndex As Long, _ ByVal dwNewLong As Long) As Long Declare Function GetSystemMenu Lib "user32" ( _ ByVal hWnd As Long, _ ByVal bRevert As Long) As Long Declare Function AppendMenu Lib "user32" _ Alias "AppendMenuA" ( _ ByVal hMenu As Long, _ ByVal wFlags As Long, _ ByVal wIDNewItem As Long, _ ByVal lpNewItem As Any) As Long Declare Function DeleteMenu Lib "user32" ( _ ByVal hMenu As Long, _ ByVal nPosition As Long, _ ByVal wFlags As Long) As Long Public Const MF_STRING = &H0& Public Const MF_BYPOSITION = &H400& Public Const GWL_WNDPROC = (-4&) Public Const WM_SYSCOMMAND = &H112 Dim PrevWndProc As Long ' Wird benötigt für das Aufrufen der WWW-Adresse Private Declare Function ShellExecute Lib "shell32.dll" _ Alias "ShellExecuteA" ( _ ByVal hWnd As Long, _ ByVal lpOperation As String, _ ByVal lpFile As String, _ ByVal lpParameters As String, _ ByVal lpDirectory As String, _ ByVal nShowCmd As Long) As Long ' Systemmeldungen an die Prozedur WndProc "umleiten" Public Sub InitSubclassing(hWnd As Long) PrevWndProc = SetWindowLong(hWnd, GWL_WNDPROC, _ AddressOf WndProc) End Sub ' Subclassing beenden Public Sub EndSubclassing(hWnd As Long) Call SetWindowLong(hWnd, GWL_WNDPROC, PrevWndProc) End Sub ' Systemmeldung "abfangen" und auswerten Public Function WndProc(ByVal hWnd As Long, _ ByVal MSG As Long, ByVal wParam As Long, _ ByVal lParam As Long) As Long Dim Result As Long ' Klick auf einen Eintrag im Systemmenü If MSG = WM_SYSCOMMAND Then Select Case wParam Case &H200 ' Neuer Eintrag 1: www.vbarchiv.de Call ShellExecute(hWnd, "Open", _ "http://www.vbarchiv.de", "", "", 1) Case &H201 ' Neuer Eintrag 2: Info... MsgBox "Info..." End Select End If WndProc = CallWindowProc(PrevWndProc, hWnd, MSG, _ wParam, lParam) End Function
Der nachfolgende Code bezieht sich auf das Formular, dessen Systemmenü angepasst werden soll.
' Handle des Systemmenüs Dim Handle As Long Private Sub Form_Load() ' Handle des Systemmenüs Handle = GetSystemMenu(hWnd, False) ' Subclassing starten InitSubclassing Me.hWnd ' Systemmenü modifizieren ' Maximieren entfernen DeleteMenu Handle, 4, MF_BYPOSITION ' Einfügen: www.vbarchiv.de AppendMenu Handle, MF_STRING, &H200, "www.vbarchiv.de" ' Einfügen: Info... AppendMenu Handle, MF_STRING, &H201, "&Info..." End Sub Private Sub Form_Unload(Cancel As Integer) ' Subclassing beenden EndSubclassing Me.hWnd End Sub