Es erstaunt mich immer wieder, was für Details fortgeschrittene und Profis kennenRSBasic hat geschrieben:Die MenuItem-Nummern sind immer statisch und es können maximal 65.536 verschiedene Menüeinträge erstellt werden.
Probiers einfach weiter, bis du den richtigen Wert gefunden hast.
Vielleicht schreibt jemand für dich ein Code, um die IDs aller Menüeinträge zu ermitteln, die vergeben sind.
Gute Nacht.


Jedenfalls hab ich den benötigten Geistesblitz gekriegt mit dem Code den du geposted hast.
Danke RS

Ich hab am Sonntag Morgen um 7 Uhr oder so, im PB 4.XX Code Archiv nenn Code gefunden gehabt.RSBasic
Code: Alles auswählen
EnableExplicit Define handle ;RunProgram("notepad.exe") ;Delay(1000) handle = FindWindow_("Notepad2", #Null) If handle PostMessage_(handle, #WM_COMMAND, 40500, 0) Else Debug "Fenster konnte nicht gefunden werden." EndIf
http://www.purearea.net/pb/CodeArchiv/M ... em+Path.pb
Diesen musste ich nur leicht abändern damit er wieder funzt, und an der richtigen Stelle ein
GetMenuItemID_ hinzufügen, dann wurden mir diese 40xxx ID's (nennen wir sie mal Menu ID's) angezeigt.
Leider war ich nicht schlau genug das richtig zu interpretieren, ich war zu fixiert auf Menu Element Positionsangaben. (hätten die ein errechenbares logisches System gehabt, hätte ich oder der User, nicht eine "Menü Item ID unter Mauszeiger" Funktion benutzen müssen)
Hier ist der korrigierte und angepasste Code.
Code: Alles auswählen
lpPoint.POINT
#MN_GETHMENU = $1E1
Global NewList lstSearchSubmenu.s()
Structure Point64
StructureUnion
p.POINT
q.q
EndStructureUnion
EndStructure
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_(cursor.Point64)
hwnd = WindowFromPoint_(cursor\q)
Submenucount = 0
phwnd = GetParent_(hwnd) ;Fenster-Handle
hMenu = GetMenu_(phwnd)
hcurrmenu.l = SendMessage_(hwnd, #MN_GETHMENU, 0,0)
menuPos = MenuItemFromPoint_(hwnd, hcurrmenu.l,cursor\q)
If oldmenuPos <> menuPos
SearchSubmenu(hMenu, hcurrmenu.l)
mnuString.s = Space(255)
Debug GetMenuItemID_(hcurrmenu,menuPos)
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
; IDE Options = PureBasic v4.02 (Windows - x86)
; Folding = -
Ich hab mir draus nenn kleinen Code Fetzen gebastelt (ich mag kleine Codes, sind vertändlicher) der das selbe tut (jeder Name und jede ID eine Menü Elementes wird ausgegeben) einziger Unterschied, mein Code zeigt im "File"->"Launch" Menü von Notepad2 folgendes an
Code: Alles auswählen
0
&New Window Alt+N
40011
-------------
Code: Alles auswählen
8
------------
&File
&Launch
-1
-1
------------
&File
&Launch
40011
0
------------
&File
&Launch
&New Window Alt+N
-1
-1
------------
Code: Alles auswählen
SendMessage_(handle,#WM_COMMAND,menu_item_id,handle)
; Das Handle hinten ist wurscht, kann mann auch ne null reinsetzen und es geht, nur das ;Fenster/Menu Handle vorne zählt, und die richtige menu_item_id

Code: Alles auswählen
PostMessage_(handle, #WM_COMMAND,menu_item_id, 0)
3Hier mein kleinerer Code
Code: Alles auswählen
Structure Point64
StructureUnion
p.POINT
q.q
EndStructureUnion
EndStructure
Repeat
GetCursorPos_(cursor.Point64)
hwnd = WindowFromPoint_( cursor\q )
phwnd = GetParent_(hwnd) ;Fenster-Handle
hMenu = GetMenu_(phwnd)
hcurrmenu.l = SendMessage_(hwnd, #MN_GETHMENU, 0,0)
menuPos = MenuItemFromPoint_(hwnd, hcurrmenu.l,cursor\q)
If menuPos <> oldmenuPos
menu_id = GetMenuItemID_(hcurrmenu,menuPos)
mnuString.s = Space(255)
GetMenuString_(hcurrmenu.l, menuPos, @mnuString, Len(mnuString), #MF_BYPOSITION)
If menu_id <> -1
Debug menuPos
Debug mnuString
Debug menu_id
Debug "-------------"
EndIf
oldmenuPos = menuPos
EndIf
Delay(100)
ForEver
schafft es bei gewissen Fenstern (AMD Power Monitor, Firefox, Seamonkey) das ich trotz richtigem Fenster Handle
(weiß ich weil SetForegroundWindow funzt, aber nur wenn die Anwendung nicht minimiert wurde, wurde sie minimiert muss ich erst ShowWindow_(handle,#SW_SHOW) benutzen) weil sonst ein falsches Handle ermittelt wird, in meinem Fall 48301700 statt 13370340)
hier bei diesen 2 Befehlen
GetParent_
GetMenu_
nicht eine 0 als Rückgabewert kriege, GetMenu_ braucht den Wert von GetParent, GetParent wiederum, gibt nur ne 0 aus.
Die Codes funzen einwandfrei, bei anderen Anwendungen (Notepad2, Notepad, Total Commander usw)
Was auch sehr merkwürdig ist, ich hab hier im Board nenn Code gefunden, der mir die Elemente von nem Fenster anzeigt, so in der Art.
Beispiel Notepad2
Code: Alles auswählen
[Title]= [hWnd]= 7996014 [ClassName]= Scintilla
[Title]= [hWnd]= 8978876 [ClassName]= SysListView32
[Title]= [hWnd]= 6620154 [ClassName]= msctls_statusbar32
[Title]= [hWnd]= 9634652 [ClassName]= ReBarWindow32
[Title]= [hWnd]= 29229440 [ClassName]= ToolbarWindow32
[Title]= [hWnd]= 21627878 [ClassName]= Static
[Title]= 508550937 [hWnd]= 90112862 [ClassName]= Static
7 <-- Anzahl der Elemente
kriege ich nur "0" vom Debugger geliefert, sonst gar nichts, auch wenn ich ein Class Element (weiß nicht genau was ne Class ist) wie "MozillaWindowClass" benutze.
Code: Alles auswählen
Procedure EnumChildProc(hwnd.l, *lParam.Long)
Protected title.s{1024}
Protected class.s{1024}
Debug hwnd
*lParam\l + 1
GetWindowText_(hwnd,@title,1024) ;Fenstertitel auslesen
GetClassName_(hwnd,@class,1024) ;Fensterklasse auslesen
Debug "[Title]= " + title + " [hWnd]= " + Str(hwnd) + " [ClassName]= " + class;Werte ausgeben
ProcedureReturn #True
EndProcedure
Procedure EnumChildWindows(hwnd.l, WindowTitel.s = "")
If WindowTitel <> ""
hwnd = FindWindow_(0, @WindowTitel)
EndIf
If hwnd = 0
ProcedureReturn 0
EndIf
Protected Anzahl.l
EnumChildWindows_(hwnd, @EnumChildProc(), @Anzahl)
ProcedureReturn Anzahl
EndProcedure
MainWin$ = "SeaMonkey"
Debug EnumChildWindows(0,MainWin$) ; Debug zeigt an wieviele Elemente es gibt
Titel,Klasse & PID zu erhalten.
Code: Alles auswählen
Procedure EnumWindows(hwnd,ignore) ;Prozedur, die die Handles der Fenster erhält
Mode = 0
;0 Show Visible Only
;1 Show All
;2 Show Invisible Only
If IsWindowVisible_(hwnd)
If Mode <= 1
ShowWin=1
EndIf
Else
If Mode >= 1
ShowWin=1
EndIf
EndIf
If ShowWin
title.s=Space(1024) : class.s=Space(1024) : pid.l=0
GetWindowText_(hwnd,@title,1024) ;Fenstertitel auslesen
GetClassName_(hwnd,@class,1024) ;Fensterklasse auslesen
GetWindowThreadProcessId_(hwnd,@pid) ;PID des zugehörigen Prozesses auslesen
Debug "[Title]= "+title+" [hWnd]= "+Str(hwnd)+" [ClassName]= "+class+" [PID]= "+Str(pid) ;Werte ausgeben
EndIf
ProcedureReturn #True ;#True wird von der WinAPI als Rückgabewert benötigt
EndProcedure
EnumWindows_(@EnumWindows(),0) ;API, die die Handles von allen Fenstern an die Funktion EnumWindows() übergibt
