API32 - Menü Text vom aktiven Fenster auslesen

Windowsspezifisches Forum , API ,..
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
funk.munich
Beiträge: 123
Registriert: 27.03.2006 09:45

API32 - Menü Text vom aktiven Fenster auslesen

Beitrag 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
Benutzeravatar
ABBKlaus
Beiträge: 61
Registriert: 15.03.2006 22:09
Wohnort: Ratingen
Kontaktdaten:

Beitrag 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
PureBasicPower TailBite Printer_Lib / PDFBarcode / PrintBarcode / ExcelWriter
funk.munich
Beiträge: 123
Registriert: 27.03.2006 09:45

Beitrag von funk.munich »

Hi,

super vielen dank. Damit funxt es einwandfrei.

Gruß,
Daniel
funk.munich
Beiträge: 123
Registriert: 27.03.2006 09:45

Beitrag 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
Benutzeravatar
ABBKlaus
Beiträge: 61
Registriert: 15.03.2006 22:09
Wohnort: Ratingen
Kontaktdaten:

Beitrag von ABBKlaus »

Versuch bitte erst im Forum zu suchen :
http://www.purebasic.fr/german/viewtopi ... windowinfo
PureBasicPower TailBite Printer_Lib / PDFBarcode / PrintBarcode / ExcelWriter
Benutzeravatar
DoubleID
Beiträge: 23
Registriert: 02.05.2006 16:14

Beitrag 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:
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

sag ma, bisschen trigger-happy oder was?
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
DoubleID
Beiträge: 23
Registriert: 02.05.2006 16:14

Beitrag 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.
Benutzeravatar
125
Beiträge: 1322
Registriert: 19.09.2004 16:52
Wohnort: Neu Wulmstorf (Hamburg)
Kontaktdaten:

Beitrag 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
Bild
BildDas ist Tux. Kopiere Tux in deine Signatur und hilf ihm so auf seinem Weg zur Weltherrschaft.
Benutzeravatar
DoubleID
Beiträge: 23
Registriert: 02.05.2006 16:14

Beitrag von DoubleID »

Ach noch so einer.
Antworten