OK...
Eigentlich ging es in diesem Thread ja um die Frage, wie man ein Item eines ListIconGadget (SysListview32) aus einem externen Programms ausliest.
Da ich allerdings die Lösung dafür in der API-Library von RSBasic gefunden habe und ich jetzt ein weiteres Problem hab, welches dem vorherigen sehr ähnlich ist, schreibe ich
diesen Thread jetzt einfach mal um, anstatt einen neuen zu öffnen.
Also wie der neue Titel schon sagt, möchte ich wissen, wie man ein Item eines externen ListIconGadgets selectiert.
Ich krieg es einfach nicht hin, den Code (mit dem man die Items ausliest) so umzuschreiben, dass diese selectiert werden, könnte mir da vieleicht jemand helfen?
*** Item eines fremden ListIconGadgets auswählen
Re: *** Item eines fremden ListIconGadgets auswählen
Eventuell hilft dir dieses Beispiel weiter.
(Ich gehe davon aus, dass das Handle vom SysListview32 bekannt ist)
(Ich gehe davon aus, dass das Handle vom SysListview32 bekannt ist)
Code: Alles auswählen
OpenWindow(0,0,0,800,600,"!")
ListIconGadget(0,10,10,780,580,"Hallo",1000,#PB_ListIcon_AlwaysShowSelection)
For t=1 To 10
AddGadgetItem(0,-1,"item_" + Str(t))
Next
Procedure SelectIten(handle, index)
Protected item.LVITEM
item\mask = #LVIF_STATE
item\state = #LVIS_SELECTED | #LVIS_FOCUSED
item\stateMask = #LVIS_SELECTED | #LVIS_FOCUSED
item\iItem = index
ProcedureReturn SendMessage_(handle, #LVM_SETITEMSTATE, index, @item)
EndProcedure
SelectIten(GadgetID(0), 5)
Repeat
Until WaitWindowEvent() = #PB_Event_CloseWindow
Re: *** Item eines fremden ListIconGadgets auswählen
@Mr.L
Ich hab deinen Code zwar nicht getestet aber ich würde jetzt einfach mal behaupten, dass das bei Listen von externen Programmen nicht so leicht funktioniert, da man keine Zugriffsberechtigung besitzt, um direkt auf den Speicher zuzugreifen.
ich hab jetzt aber nach viel hin und her probieren eine Procedure zustande gekriegt, mit der es funktioniert.
So sieht sie aus:
der Parameter "Position" entspricht dem Element, welches selektiert werden soll (beginnend bei 0),
den Parameter "Process" dieser Procedure erhält man mit dieser Procedure:
und bei beiden Procedures entspricht der Parameter "Handle" dem der Liste (SysListView32), deren Eintrag selektiert werden soll.
Ich hab deinen Code zwar nicht getestet aber ich würde jetzt einfach mal behaupten, dass das bei Listen von externen Programmen nicht so leicht funktioniert, da man keine Zugriffsberechtigung besitzt, um direkt auf den Speicher zuzugreifen.
ich hab jetzt aber nach viel hin und her probieren eine Procedure zustande gekriegt, mit der es funktioniert.
So sieht sie aus:
Code: Alles auswählen
Procedure SelectExternListItem(Handle, Process, Position)
Protected.LV_ITEM Item, *Item
*Item = VirtualAllocEx_(Process, 0, 4096, #MEM_COMMIT | #MEM_RESERVE,#PAGE_READWRITE)
With Item
\mask = #LVIF_STATE
\stateMask = #LVIS_FOCUSED | #LVIS_SELECTED
\state = #LVIS_FOCUSED | #LVIS_SELECTED
\iItem = Position
EndWith
WriteProcessMemory_(Process, *Item, @Item, SizeOf(Item), 0)
SendMessage_(Handle, #LVM_SETITEM, 0, *Item)
VirtualFreeEx_(Process, *Item, 0, #MEM_RELEASE)
EndProcedure
den Parameter "Process" dieser Procedure erhält man mit dieser Procedure:
Code: Alles auswählen
Procedure OpenProcessFromHandle(Handle)
Protected.i ProcessID, Process
GetWindowThreadProcessId_(Handle, @ProcessID)
Process = OpenProcess_(#PROCESS_VM_OPERATION | #PROCESS_VM_READ | #PROCESS_VM_WRITE, #False, ProcessID)
ProcedureReturn Process
EndProcedure
Re: *** Item eines fremden ListIconGadgets auswählen
Für solche Fälle ist es interessant sich anzuschauen was für Messages tatsächlich bei der gewünschten Aktion gesendet werden, so kann man das Verhalten meisst recht einfach kopieren. Tool zum aufzeichnen von Messages wäre z.B. Spy++.
Zu mir kommen behinderte Delphine um mit mir zu schwimmen.
Wir fordern mehr Aufmerksamkeit für umfallende Reissäcke!
Wir fordern mehr Aufmerksamkeit für umfallende Reissäcke!
