Seite 1 von 1

Menüpunkt samt Pfad zum Untermenü ermitteln

Verfasst: 28.01.2005 22:01
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.

Verfasst: 29.01.2005 15:06
von PBFetischist
:allright:

Klasse Teil.