Dieser Tipp zeigt Ihnen, wie Sie das Systemmenü eines Formulares beliebig erweitern können und auf das Click-Ereignis des neuen Eintrages reagieren. Kopieren Sie den folgenden Code in ein Modul: Option Explicit ' API-Funktionen für das Erstellen der Menüeinträge Private Declare Function GetSystemMenu Lib "user32" ( _ ByVal hwnd As Long, _ ByVal bRevert As Long) As Long Private Declare Function InsertMenu Lib "user32" _ Alias "InsertMenuA" ( _ ByVal hMenu As Long, _ ByVal nPosition As Long, _ ByVal wFlags As Long, _ ByVal wIDNewItem As Long, _ ByVal lpNewItem As Any) As Long ' API-funktionen für das Subclassing 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 MF_SEPARATOR = &H800& Private Const MF_BYPOSITION = &H400& Private Const GWL_WNDPROC = (-4) Private Const WM_SYSCOMMAND = &H112 Private lngPrevProc As Long Private intItemID As Integer Public Enum MenuInsertType Separator = 0 MenuByPosition = 1 End Enum ' neuen Menü-Eintrag hinzufügen Public Function CreateMenuEntry(ByVal strName As String, _ ByVal lngFormHwnd As Long, _ ByVal intMenuPosition As Integer, _ ByVal mnuType As MenuInsertType) As Boolean Dim lngMnuHandle As Long Dim lngRetValue As Long Dim intFlag As Integer On Error GoTo errHandler ' Handle des SystemMenu lngMnuHandle = GetSystemMenu(lngFormHwnd, False) ' Eintragtyp aus Enum ermitteln Select Case mnuType Case MenuInsertType.MenuByPosition intFlag = MF_BYPOSITION Case MenuInsertType.Separator intFlag = MF_SEPARATOR End Select If lngMnuHandle Then ' Menüeintrag erstellen lngRetValue = InsertMenu(lngMnuHandle, intMenuPosition, _ intFlag, intItemID, strName) End If CreateMenuEntry = True Exit Function errHandler: CreateMenuEntry = False Err.Clear End Function ' einen Hook auf das Form erstellen Public Sub CreateHook(ByVal lngHwnd As Long) lngPrevProc = SetWindowLong(lngHwnd, GWL_WNDPROC, AddressOf WindowProc) End Sub ' WICHTIG: den Hook wieder freigeben Public Sub ReleaseHook(ByVal lngHwnd As Long) SetWindowLong lngHwnd, GWL_WNDPROC, lngPrevProc End Sub ' Subclassing Public Function WindowProc(ByVal hwnd As Long, _ ByVal uMsg As Long, _ ByVal wParam As Long, _ ByVal lParam As Long) As Long WindowProc = CallWindowProc(lngPrevProc, hwnd, uMsg, wParam, lParam) If uMsg = WM_SYSCOMMAND Then If wParam = intItemID Then MsgBox "Neuer Menüeintrag Click ... " End If End If End Function Um nun unser neues Modul zu testen, müssen Sie ein neues Formular erstellen und folgenden Code einfügen: Private Sub Form_Load() ' Menü-Eintrag hinzufügen If CreateMenuEntry("Testeintrag", Me.hwnd, 5, MenuByPosition) = True Then Call MsgBox("Menüeintrag erfolgreich erstellt!") End If Call CreateHook(Me.hwnd) End Sub Private Sub Form_Unload(Cancel As Integer) ' WICHTIG! Korrrektes Beenden des Subclassing! Call ReleaseHook(Me.hwnd) End Sub Dieser Tipp wurde bereits 11.007 mal aufgerufen. Voriger Tipp | Zufälliger Tipp | Nächster Tipp
Anzeige
Diesen und auch alle anderen Tipps & Tricks finden Sie auch auf unserer aktuellen vb@rchiv Vol.6 (einschl. Beispielprojekt!) Ein absolutes Muss - Geballtes Wissen aus mehr als 8 Jahren vb@rchiv! - nahezu alle Tipps & Tricks und Workshops mit Beispielprojekten - Symbol-Galerie mit mehr als 3.200 Icons im modernen Look Weitere Infos - 4 Entwickler-Vollversionen (u.a. sevFTP für .NET), Online-Update-Funktion u.v.m. |
sevISDN 1.0 Überwachung aller eingehender Anrufe! Die DLL erkennt alle über die CAPI-Schnittstelle eingehenden Anrufe und teilt Ihnen sogar mit, aus welchem Ortsbereich der Anruf stammt. Weitere Highlights: Online-Rufident, Erkennung der Anrufbehandlung u.v.m. Tipp des Monats April 2024 Skyfloy Chart von Microsoft und dazu noch gratis Tutorial für Microsoft Chart Controls für Microsoft .NET Framework 3.5 sevZIP40 Pro DLL Zippen und Unzippen wie die Profis! Mit nur wenigen Zeilen Code statten Sie Ihre Anwendungen ab sofort mit schnellen Zip- und Unzip-Funktionen aus. Hierbei lassen sich entweder einzelnen Dateien oder auch gesamte Ordner zippen bzw. entpacken. |
||||||||||||||||
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein. |