Die Community zu .NET und Classic VB.
Menü

VB 5/6-Tipp 0136: Menütext unter der Maus auslesen

 von 

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:

Schwierigkeitsgrad 2

Verwendete API-Aufrufe:

CallWindowProcA (CallWindowProc), GetMenuStringA (GetMenuString), SetWindowLongA (SetWindowLong)

Download:

Download des Beispielprojektes [2,72 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"
' 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-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.

Danke... - DL9LD 25.12.16 15:28 2 Antworten

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