VB 5/6-Tipp 0136: Menütext unter der Maus auslesen
von ActiveVB
Beschreibung
Hiermit läßt sich der gerade von der Maus abgefahrene Menütext auslesen. Eine direkte Anwendung fällt mir da leider auch nich auf Anhieb ein, aber es wäre damit eine zusätzlich eingespielte Hilfe oder ein ToolTipText denkbar.
Schwierigkeitsgrad: | Verwendete API-Aufrufe: CallWindowProcA (CallWindowProc), GetMenuStringA (GetMenuString), SetWindowLongA (SetWindowLong) | 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: Beschriftungsfeld "Label1" ' Steuerelement: Menü "mnuMenü" ' Steuerelement: Menü "a" auf mnuMenü ' Steuerelement: Menü "b" auf mnuMenü ' Steuerelement: Menü "c" auf mnuMenü ' Steuerelement: Menü "d" auf mnuMenü ' Steuerelement: Menü "mnuExtras" ' Steuerelement: Menü "e" auf mnuExtras ' Steuerelement: Menü "f" auf mnuExtras ' Steuerelement: Menü "g" auf mnuExtras ' Steuerelement: Menü "h" auf mnuExtras Option Explicit Private Sub Form_Load() Call Init(Me.hwnd) End Sub Private Sub Form_Unload(Cancel As Integer) Call Terminate(Me.hwnd) End Sub '---------- Ende Formular "Form1" alias Form1.frm ---------- '--------- Anfang Modul "Module1" alias Module1.bas --------- Option Explicit 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 Declare Function SetWindowLong Lib "user32" Alias _ "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex _ As Long, ByVal dwNewLong As Long) As Long Private Declare Function GetMenuString Lib "user32" Alias _ "GetMenuStringA" (ByVal hMenu As Long, ByVal wIDItem _ As Long, ByVal lpString As String, ByVal nMaxCount As _ Long, ByVal wFlag As Long) As Long Const MF_BYCOMMAND = &H0& Const WM_MENUSELECT = &H11F Const GWL_WNDPROC = (-4&) Dim PrevWndProc& Private Function SubWndProc(ByVal hwnd As Long, ByVal MSG As Long, _ ByVal wParam As Long, ByVal lParam As _ Long) As Long Dim Result&, Lo, Hi, Buffer$ If MSG = WM_MENUSELECT Then Hi = Int(wParam / 65536) Lo = wParam - Hi * 65536 If Lo <> 0 Then Buffer = Space$(128) Result = GetMenuString(lParam, Lo, Buffer, Len(Buffer), _ MF_BYCOMMAND) Form1.Caption = Left$(Buffer, Result) End If End If SubWndProc = CallWindowProc(PrevWndProc, hwnd, MSG, wParam, lParam) End Function Public Sub Init(hwnd&) PrevWndProc = SetWindowLong(hwnd, GWL_WNDPROC, AddressOf SubWndProc) End Sub Public Sub Terminate(hwnd&) Call SetWindowLong(hwnd, GWL_WNDPROC, PrevWndProc) End Sub '---------- Ende Modul "Module1" alias Module1.bas ---------- '-------------- 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 8 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 Markus Rankl am 21.05.2006 um 19:10
Gibt es eine Möglichkeit herauszufinden, ob die CHECKED-Eigenschaft eines Menüeintrags gesetzt ist oder nicht.
Kommentar von Jonathan Haas am 11.10.2003 um 17:16
Sogar Stop-Button-unempfindich.
Super!
Kommentar von Clemens Weiß am 25.03.2002 um 03:09
Ah moment,
das erste
Buffer = Left$(Buffer, Result)
kann man natürlich weglassen...
Kommentar von Clemens Weiß am 25.03.2002 um 02:54
Hi,
wenn man in seinen Menüs Shortcuts verwendet und die nicht mit angezeigt haben möchte, ginge das z. B. so:
Buffer = Left$(Buffer, Result)
If InStr(1, Buffer, vbTab) 0 Then Result = InStr(1, Buffer, vbTab) - 1
Form1.Caption = Left$(Buffer, Result)
Oder gibts eine bessere/elegantere Möglichkeit?
MfG
Clemens Weiß
www.webplain.de
Kommentar von TomParis am 24.03.2002 um 17:03
Das Programm kann man noch erweitern, enn man es mit dem "Text to Speech" Steuerelement koppelt. Hammergeil!
Kommentar von Jan Thomä am 12.07.2001 um 19:02
Die Texte der ersten Ebene erhält man so irgendwie gar nicht. Man kann jedoch verhindern, daß falsche Texte angezeigt werden:
If msg = WM_MENUSELECT Then
Hi = wParam \ 2 ^ 16
Lo = wParam And (2 ^ 16 - 1)
If Lo 0 Then
Buffer = Space$(256)
If (Hi And MF_POPUP) = 0 Then
result = GetMenuString(lParam, Lo, Buffer, Len(Buffer), MF_BYCOMMAND)
Else
'hier wurde ein Top-menüeintrag selektiert Exit Function
End If
frmMain.setStatusBarText 1, frmMain.getMenuToolTip(Left$(Buffer, result))
End If
End If
Kommentar von Stefan Brunner am 02.07.2001 um 14:46
Wie erhält man die Menü-Texte der ersten Hierarchieebene (Tages-Menü, Extras)?
Beim Hinzufügen weiterer Menüs werden für die erste Hierarchieebene der hinzugefügten Menüs falsche Menütexte angezeigt. Wie lässt sich der (scheinbar systematische Fehler) beheben?
Kommentar von CompuBot am 24.03.2001 um 20:50
Beispiel einer Anwednung: Informationen zu einem Menüpunkt in einer StatusBar anzeigen