ich habe wieder mal eine Frage, wo ich eure Hilfe brauche.
Ich habe ein Java Windows Programm, wo es eine Klasse ToolbarWindow321 gibt. In dieser sind mehrere Buttons integriert. (Siehe Farben)
Nun möchte ich diese einzelnen Reiter auslesen ( haben alle eine Bezeichnung ) und, je was für eine Bezeichnung diese einzelnen TAB/Buttons haben, diesen dann schliessen.
Dazu gibt es schon eine Möglichkeit bei WinSpyM, wo ich den Namen des TAB/Button auslesen kann.
https://www.autohotkey.com/boards/search.php?author_id=82923&sr=posts
Übrigens eine richtig gute Ergänzung zu Windowws Spy!
Dazu nur das betreffende Codeschnipsel.
Code: Select all
Test := WinExist(" jp2launcher.exe")
WinActivate, ahk_id %Test%
ControlGet, g_hWnd, hWnd,,ToolbarWindow321, ahk_id %Test%
ToolbarItems := GetToolbarItems(g_hWnd)
For Each, Item in ToolbarItems {
MsgBox % "Zeilennummer " A_LineNumber " und Ergebnis : A_Index: " A_Index " Item.ID: " Item.ID " Item.String: " Item.String
}
return
GetToolbarItems(hToolbar) {
WinGet PID, PID, ahk_id %hToolbar%
If !(hProc := DllCall("OpenProcess", "UInt", 0x438, "Int", False, "UInt", PID, "Ptr")) {
Return
}
If (A_Is64bitOS) {
Try DllCall("IsWow64Process", "Ptr", hProc, "Int*", Is32bit := true)
} Else {
Is32bit := True
}
RPtrSize := Is32bit ? 4 : 8
TBBUTTON_SIZE := 8 + (RPtrSize * 3)
SendMessage 0x418, 0, 0,, ahk_id %hToolbar% ; TB_BUTTONCOUNT
ButtonCount := ErrorLevel
IDs := [] ; Command IDs
Loop %ButtonCount% {
Address := DllCall("VirtualAllocEx", "Ptr", hProc, "Ptr", 0, "UPtr", TBBUTTON_SIZE, "UInt", 0x1000, "UInt", 4, "Ptr")
SendMessage 0x417, % A_Index - 1, Address,, ahk_id %hToolbar% ; TB_GETBUTTON ; Wird die Reihenfolge der Id's ermiitelt zum A_index
If (ErrorLevel == 1) {
VarSetCapacity(TBBUTTON, TBBUTTON_SIZE, 0)
DllCall("ReadProcessMemory", "Ptr", hProc, "Ptr", Address, "Ptr", &TBBUTTON, "UPtr", TBBUTTON_SIZE, "Ptr", 0)
IDs.Push(NumGet(&TBBUTTON, 4, "Int"))
}
DllCall("VirtualFreeEx", "Ptr", hProc, "Ptr", Address, "UPtr", 0, "UInt", 0x8000) ; MEM_RELEASE
}
ToolbarItems := []
Loop % IDs.Length() {
ButtonID := IDs[A_Index]
;~ SendMessage 0x44B, %ButtonID% , 0,, ahk_id %hToolbar% ; TB_GETBUTTONTEXTW
;BufferSize := ErrorLevel * 2
BufferSize := 128
Address := DllCall("VirtualAllocEx", "Ptr", hProc, "Ptr", 0, "UPtr", BufferSize, "UInt", 0x1000, "UInt", 4, "Ptr")
SendMessage 0x44B, %ButtonID%, Address,, ahk_id %hToolbar% ; TB_GETBUTTONTEXTW
VarSetCapacity(Buffer, BufferSize, 0)
Test := DllCall("ReadProcessMemory", "Ptr", hProc, "Ptr", Address, "Ptr", &Buffer, "UPtr", BufferSize, "Ptr", 0)
MsgBox % "Zeilennummer " A_LineNumber " und Ergebnis : " Buffer
ToolbarItems.Push({"ID": IDs[A_Index], "String": Buffer})
DllCall("VirtualFreeEx", "Ptr", hProc, "Ptr", Address, "UPtr", 0, "UInt", 0x8000) ; MEM_RELEASE
}
DllCall("CloseHandle", "Ptr", hProc)
For Each, Item in ToolbarItems {
MsgBox % "Zeilennummer " A_LineNumber " und Ergebnis : A_Index: " A_Index " Item.ID: " Item.ID " Item.String: " Item.String
}
Return ToolbarItems
}
Ich verstehe einfach nicht, wieso ich den Namen des jeweiligen Buttons in diesem Schnipsel nicht über die Msgbox abfragen kann, sonder dafür extra eine FOR Schleife laufen lassen muss. Was ist mein Denkfehler?
und 2. Frage.: Wie kann ich dann den betroffnenen Button schliessen?
Danke Bert