Seite 1 von 2

API32 - Menü Text vom aktiven Fenster auslesen

Verfasst: 30.04.2006 17:06
von funk.munich
Hi zusammen,

ich kann mit folgenden Code die Menüeinträge des aktiven Fensters
auslesen. Jedoch bekomme ich es nicht hin die existierenden Untermenüs
eines Menüpunktes auszulesen.

z.B. PureBasic Editor
Im erstem Menüpunkt "File" existiert ein Menüeintrag "Recent Files".
Für diesen Eintrag erhalte ich über die API nur den ID Wert "-1" und kann
somit das Untermenü nicht weiter auslesen :(

Hätte hierzu jemand eine Idee, wie ich das hinbekommen kann oder
ob es einen API Aufruf gibt mit dem ich das Problem lösen kann?

Wäre super, wenn Ihr mir hier weiterhelfen könntet.

Danke + Gruß,
Daniel

Code: Alles auswählen

  Declare getWHandle()
  
  MessageRequester("API32 - Menu Infos", "You can abort program with ESC key.")
  
  Repeat
    
    ; Stop recording
    If GetAsyncKeyState_(#VK_ESCAPE)
      Quit = 1
    EndIf

    ; Save Left Button
    If GetAsyncKeyState_(#VK_LBUTTON)
      If LB = 0
         LB = 1
      EndIf
    Else
      If LB = 1
        getWHandle()
        LB = 0
      EndIf
    EndIf
  
  Until Quit = 1
  
  Procedure getWHandle()
  
    count = 0
    exit = 0
    buffer.s = ""
    length = 1024
    
    ; get active window id
    hWnd = GetForegroundWindow_()
    ; get menu id from active window
    hMenu = GetMenu_(hWnd)
    
    ; example with purebasic menu
    While exit = 0
      ; get all menu ids
      hMenuSub = GetSubMenu_(hMenu, count)
      ; 0 = end of menubar
      If hMenuSub > 0
        Debug "--- Menu " + Str(count) + " ---"
        
        ; how many entries exist in submenu
        leng = GetMenuItemCount_(hMenuSub)
        
        ; get all submenu ids
        For i = 0 To leng
          id = GetMenuItemID_(hMenuSub, i)
          If id <> -1
            GetMenuString_(hMenuSub, id, @buffer, @length, 0)
            If buffer <> ""
              Debug Str(id) + ": " + buffer
            Else
              Debug id
            EndIf
          Else
            Debug id
          EndIf
        Next
        count = count + 1
      Else
        exit = 1
      EndIf
    Wend
    
    Debug "--- END ---"
    
  EndProcedure

Verfasst: 01.05.2006 18:50
von ABBKlaus
ein bischen rekursivität :mrgreen: dann gehts :wink:

Code: Alles auswählen

#MIIM_STATE      = $00000001
#MIIM_ID         = $00000002
#MIIM_SUBMENU    = $00000004
#MIIM_CHECKMARKS = $00000008
#MIIM_TYPE       = $00000010
#MIIM_DATA       = $00000020
#MIIM_STRING     = $00000040
#MIIM_BITMAP     = $00000080
#MIIM_FTYPE      = $00000100

#MFT_STRING = 0

  Declare   getWHandle() 
  Declare.s GetMenuText(hMenu,index)
  Declare   GetMenu(hMenu)
  
  MessageRequester("API32 - Menu Infos", "You can abort program with ESC key.") 
  
  Repeat 
    
    ; Stop recording 
    If GetAsyncKeyState_(#VK_ESCAPE) 
      Quit = 1 
    EndIf 

    ; Save Left Button 
    If GetAsyncKeyState_(#VK_LBUTTON) 
      If LB = 0 
         LB = 1 
      EndIf 
    Else 
      If LB = 1 
        getWHandle()
        ;Quit=1
        LB = 0 
      EndIf 
    EndIf 
  Delay(1)
  Until Quit = 1 
  
  Procedure getWHandle() 
  
    count = 0 
    exit = 0 
    buffer.s = "" 
    length = 1024 
    
    ; get active window id 
    hWnd = GetForegroundWindow_() 
    ; get menu id from active window 
    hMenu = GetMenu_(hWnd)
    GetMenu(hMenu)
    Debug "--- END ---" 
    
  EndProcedure 

Procedure.s GetMenuText(hMenu,index)
  buf$=Space(256)
  infmenu.MENUITEMINFO
  infmenu\cbSize=SizeOf(MENUITEMINFO)
  infmenu\fMask=#MIIM_STRING|#MIIM_ID
  infmenu\fType=#MFT_STRING
  infmenu\dwTypeData=@buf$
  infmenu\cch=256
  GetMenuItemInfo_(hMenu,index,#True,infmenu)
  ProcedureReturn buf$
EndProcedure

Procedure GetMenu(hMenu)
  Static index
  Protected oldindex
  index+1
  anzahl=GetMenuItemCount_(hMenu)
  If anzahl>0
    For i=0 To anzahl-1
      buf$=GetMenuText(hMenu,i)
      Debug Str(index)+":"+Str(i+1)+"="+buf$
      SubMenu=GetSubMenu_(hMenu,i)
      If SubMenu
        oldindex=index
        GetMenu(SubMenu)
        index=oldindex
      EndIf
    Next
  EndIf
  index=0
EndProcedure

Verfasst: 01.05.2006 19:30
von funk.munich
Hi,

super vielen dank. Damit funxt es einwandfrei.

Gruß,
Daniel

Verfasst: 02.05.2006 08:23
von funk.munich
Hi,

ich hätte da noch eine Frage. Vielleicht weisst Du dazu auch etwas ...

Mit welchen API Call kann ich auf die Objekt ID's von Textfeldern sowie
Schaltflächen zugreifen?

Wäre super, wenn Du hierzu auch noch einen Tip für mich hättest.

Danke + Gruß,
Daniel

Verfasst: 02.05.2006 10:35
von ABBKlaus
Versuch bitte erst im Forum zu suchen :
http://www.purebasic.fr/german/viewtopi ... windowinfo

Verfasst: 10.05.2006 17:01
von DoubleID
@ABBKlaus

Na du bist ja ein Schlaumeier.

EnumAllWindows V3 <-> API32 - Menü Text vom aktiven Fenster auslesen


Irre ich mich oder haben die beiden Titel nicht das geringste gemeinsam. Vor allem nicht für jemanden der nicht mit der API firm ist.
Da könnt ich kotzen bis Buxdehude wenn ich solche total bescheuerten, nachgeplapperten Sprüche lese.

Dein Spruch ist ja vieleicht manchmal angebracht. Aber man sollte sich schon vorher überlegen ob er überhaupt angebracht ist.

:evil:

Verfasst: 10.05.2006 19:39
von Kaeru Gaman
sag ma, bisschen trigger-happy oder was?

Verfasst: 10.05.2006 21:22
von DoubleID
Wenn du mich meinst..

Nein, allergisch !
Diesen Spruch hat hier mal jemand angefangen und nu plappert ihn jeder nach, auch wenns zum Zeitpunkt sinnlos ist.

Verfasst: 10.05.2006 22:16
von 125
DoubleID hat geschrieben:Wenn du mich meinst..

Nein, allergisch !
Diesen Spruch hat hier mal jemand angefangen und nu plappert ihn jeder nach, auch wenns zum Zeitpunkt sinnlos ist.
Bild

Verfasst: 10.05.2006 22:33
von DoubleID
Ach noch so einer.