Menüpunkt samt Pfad zum Untermenü ermitteln

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
VoSs2o0o
Beiträge: 25
Registriert: 29.08.2004 16:58
Kontaktdaten:

Menüpunkt samt Pfad zum Untermenü ermitteln

Beitrag von VoSs2o0o »

Weil mich dieses Stück Code eine ganze Menge Nerven gekostet hat poste ich es mal hier:

- es wird der Menüpunkt unter der Maus ermittelt
- es wird der Handle zur Menüstruktur ermittelt
- anschliessend wird vom Handle zur Menüstruktur aus rekursiv gesucht,
bis der Menüpunkt samt Pfad ermittelt wurde

Nach dem starten des Programms muss natürlich die Maus über einen
Menüpunkt gefahren werden (z.B. einfach das Menü vom Editor öffnen)

Code: Alles auswählen

lpPoint.Point
#MN_GETHMENU = $1E1

NewList lstSearchSubmenu.s()

Procedure SearchSubmenu(hmenu, hcurrmenu.l)
  count = GetMenuItemCount_(hmenu)
    For mnucount=0 To count -1
      hsubmenu = GetSubmenu_(hmenu, mnucount)
      If hsubmenu <> 0
        If hsubmenu = hcurrmenu.l
          mnuString.s = Space(255)
          GetMenuString_(hmenu, mnucount, @mnuString, Len(mnuString), #MF_BYPOSITION)
          InsertElement(lstSearchSubmenu.s())
          lstSearchSubmenu.s() = mnuString
          ProcedureReturn #True
        Else
          erg = SearchSubmenu(hsubmenu, hcurrmenu.l)
          If erg = #True
            mnuString.s = Space(255)
            GetMenuString_(hmenu, mnucount, @mnuString, Len(mnuString), #MF_BYPOSITION)
            InsertElement(lstSearchSubmenu.s())
            lstSearchSubmenu.s() = mnuString
            ProcedureReturn erg
          EndIf
        EndIf
      EndIf
    Next
EndProcedure

While 1=1
  GetCursorPos_(lpPoint)
  hwnd = WindowFromPoint_(lpPoint\X, lpPoint\Y)
  Submenucount = 0
  phwnd = GetParent_(hwnd)  ;Fenster-Handle
  hmenu = GetMenu_(phwnd)
  hcurrmenu.l = SendMessage_(hwnd, #MN_GETHMENU, 0,0)
  menuPos = MenuItemFromPoint_(hwnd, hcurrmenu.l, lpPoint\X, lpPoint\Y)
  If oldmenuPos <> menuPos
    SearchSubmenu(hmenu, hcurrmenu.l)
    mnuString.s = Space(255)
    GetMenuString_(hcurrmenu.l, menuPos, @mnuString, Len(mnuString), #MF_BYPOSITION)
    LastElement(lstSearchSubmenu.s()) 
    AddElement(lstSearchSubmenu.s())
    lstSearchSubmenu.s() = mnuString
    Debug "------------"
    ForEach lstSearchSubmenu.s()
      Debug lstSearchSubmenu.s()
    Next
    ClearList(lstSearchSubmenu.s())
    oldmenuPos = menuPos
  EndIf
  Submenucount = 0
Wend
PS: Vielleicht geht das auch rückwärts ohne Suche, ich habe aber keine Möglichkeit gefunden das darüberliegende Menühandle zu ermitteln.
PBFetischist
Beiträge: 55
Registriert: 26.10.2004 19:42

Beitrag von PBFetischist »

:allright:

Klasse Teil.
Antworten