Seite 1 von 1

*** Item eines fremden ListIconGadgets auswählen

Verfasst: 26.11.2012 04:16
von Sunny
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?

Re: *** Item eines fremden ListIconGadgets auswählen

Verfasst: 01.12.2012 10:33
von Mr.L
Eventuell hilft dir dieses Beispiel weiter.
(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

Verfasst: 02.12.2012 14:31
von Sunny
@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:

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
der Parameter "Position" entspricht dem Element, welches selektiert werden soll (beginnend bei 0),
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
und bei beiden Procedures entspricht der Parameter "Handle" dem der Liste (SysListView32), deren Eintrag selektiert werden soll.

Re: *** Item eines fremden ListIconGadgets auswählen

Verfasst: 31.12.2012 11:37
von Thorium
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++.