Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Item aus Fremder Listview selektieren (https://www.delphipraxis.net/51015-item-aus-fremder-listview-selektieren.html)

perle 4. Aug 2005 14:40


Item aus Fremder Listview selektieren
 
Hallo, ich möchte gerne ein bestimmtes Item einer ListView in einer fremden Anwendung finden und dort selektieren.

Das erste Problem was ich hier bekomme, ist das finden des Items.

Ich dachte mir das so :

- handle finden :
hab ich mit findwindow/findwindowex gemacht und komme so auf mein handle (habs mit x-spy überprüft, und es stimmt auch)

- itemcount ermitteln
hab ich mit
Delphi-Quellcode:
ItemCount := SendMessage(mein_handle,LVM_GETITEMCOUNT,0,0)
gemacht und bekomme auch den richtigen Wert zurückgeliefert

- mit einer Schleife durchlaufen und von jedem Item den Text ermitteln

Delphi-Quellcode:
var
  arrCh : Array[0..MAX_PATH] of char;
...
for I := 0 to ItemCount - 1 do
begin
  ListView_GetItemText(mein_Handle,i,0,arrCh,MAX_PATH); // hab auch @arrCh versucht
  ShowMessage(arrCh);
end;
doch das gibt nur leerstrings zurück

Delphi-Quellcode:

var
  arrCh : Array[0..MAX_PATH] of char;
  LVItem : TLVItem;
...
for I := 0 to ItemCount - 1 do
begin
  SendMessage(mein_Handle,LVM_GETITEMTEXT,iLoop,Integer(@LVItem)
  ShowMessage(LVItem.pszText);
end;
gibt aber ebenfalls nur leerstrings zurück. Als letztes hab ich noch das probiert :

[delphi]
var
LVItemInfo : TLVFindInfo;
idx : Integer;
...
LVItemInfo.flags := LVFI_STRING;
LVItemInfo.psz := 'test';
idx := SendMessage(mein_Handle,LVM_FINDITEM,-1,Integer(@LVItemInfO));
[/delphi

idx ist dann aber 0 (obwohl das item mit dem Text 'test' an dritter stelle ist und im Fehlerfall der Funktion -1 zurückgegeben werden sollte.

Was mache ich denn falsch? Oder was könnte ich noch probieren?

perle 5. Aug 2005 11:01

Re: Item aus Fremder Listview selektieren
 
scheint keiner zu wissen?

Ich hab mittlerweile selber rausgefunden, wie ich die items ansprechen kann (anhand eines codes, den Luckie und NicoDE mal geschrieben haben)

Jetzt müsste ich nur noch wissen, wie ich das gefundene Item auswähle (so als ob man mit der Maus drauf klickt)

habs etwa mit :

Delphi-Quellcode:
ListView_SetItemState(mein_handle, itemIndex, LVIS_FOCUSED + LVIS_SELECTED,LVIS_FOCUSED + LVIS_SELECTED);
ListView_EnsureVisible(mein_handle,itemIndex,TRUE);
versucht, geht aber nicht :(

weiß da jemand mehr?

Olli 8. Aug 2005 17:25

Re: Item aus Fremder Listview selektieren
 
Hiho,

da ich ja schräg von der Seite im Chat angesprochen wurde :mrgreen: will ich mich doch einmal dazu äußern.

Ich habe das Problem bereits einmal für TreeView gelöst. Hier wird oft vernachlässigt, daß alle außer den Basis-Controls (Button, Edit, Static, usw ...) - und also die Common Controls - Probleme haben, weil es ja in Windows die Prozeßgrenzen gibt. Wenn man ein WM_SETTEXT oder WM_GETTEXT auf ein Fenster in einem fremden Prozeß macht, so funktioniert dies primär aus Kompatibilitätsgründen mit Win16. Wenn wir allerdings von den Common Controls sprechen, dann sprechen wir von nativen Win32-Controls. Diese beachten das Systemdesign von Win32 indem sie u.a. die Prozeßgrenzen würdigen. Entsprechend müssen wir dies auch tun. Und zwar tut man dies, indem man mit Win32-Mitteln im Prozeßbereich des anderen Prozesses Speicher alloziert und auch deren Pointer an die Nachrichten übergibt. Denn daß wir nicht einen Pointer aus unserem Prozeß übergeben oder einen fremden entgegennehmen dürfen und dann erwarten, daß dies funktioniert, sollte wohl jedem klar sein ;)

Download
http://assarbad.net/stuff/!export/treeviewtext.rar

Sorry, habe aktuell für weitere Erläuterungen keine Zeit. Vielleicht kommt noch etwas später dazu ... ;)

Luckie 8. Aug 2005 17:35

Re: Item aus Fremder Listview selektieren
 
Siehe dazu LuckieDIPS. Ist mit Source.

perle 9. Aug 2005 09:49

Re: Item aus Fremder Listview selektieren
 
Danke für eure Antworten. Ich hab mir aus den Sources mal was passendes zusammen gehackstückelt :) und bekomme jetzt auch den Itemtext bzw den Index eines von mir gesuchten icons angezeigt.

Jetzt wollte ich noch ein bestimmtes gefundenes Item auswählen können also so, als ob man mit der Maus draufklickt, Ich hab es wiedermal mit diversen Messages probiert (z.B. LVM_SETITEMSTATE) aber es ist wieder nichts bei rumgekommen, wäre nett wenn ihr auch dazu eine Lösung hättet.


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:27 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz