*** Item eines fremden ListIconGadgets auswählen

Windowsspezifisches Forum , API ,..
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
Benutzeravatar
Sunny
Beiträge: 290
Registriert: 19.02.2009 06:02

*** Item eines fremden ListIconGadgets auswählen

Beitrag 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?
Mr.L
Beiträge: 51
Registriert: 05.02.2011 21:04

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

Beitrag 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
Benutzeravatar
Sunny
Beiträge: 290
Registriert: 19.02.2009 06:02

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

Beitrag 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.
Benutzeravatar
Thorium
Beiträge: 1722
Registriert: 12.06.2005 11:15
Wohnort: Germany
Kontaktdaten:

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

Beitrag 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++.
Zu mir kommen behinderte Delphine um mit mir zu schwimmen.

Wir fordern mehr Aufmerksamkeit für umfallende Reissäcke! Bild
Antworten