Einzelnen Beitrag anzeigen

Benutzerbild von toms
toms
(CodeLib-Manager)

Registriert seit: 10. Jun 2002
4.648 Beiträge
 
Delphi XE Professional
 
#8

Re: ListView aus einer fremden Anwendung durchsuchen/anklick

  Alt 22. Jan 2008, 14:18
Mir ist keine Möglichkeit bekannt, einem bestimmten Item eine "onclick" Nachricht zu schicken.
Eine Möglichkeit wäre es, das gefundene Item zu markieren und dann Enter der Listview zu senden. Dies funktioniert sogar dann, wenn das Fenster, auf welchem sich die Listview befindet, nicht sichtbar ist.

Die Click Funktion könnte dann grob etwa so aussehen:

Delphi-Quellcode:
function LVClickItem(hwndLV: HWND; sItemText: string): Boolean;
const
  MaxTextLen = 1024;
var
  MemMgr: TProcessMemMgr;
  Item: TLVItem;
  i: Integer;
  PrItemText: PChar;
  PrItem: PLVItem;
begin
  Result := False;
  MemMgr := CreateProcessMemMgrForWnd(hwndLV);
  try
    PrItemText := MemMgr.AllocMem(MaxTextLen);
    PrItem := MemMgr.AllocMem(SizeOf(TLVItem));
    i := ListView_GetNextItem(hwndLV, -1, LVNI_ALL);
    while i >= 0 do
    begin
        //Item Eigenschaften setzen
        Item.mask := LVIF_TEXT;
        Item.iItem := i;
        Item.iSubItem := 0;
        Item.pszText := PrItemText;
        Item.cchTextMax := MaxTextLen;
        MemMgr.Write(Item, PrItem, SizeOf(TLVItem));
        if not ListView_GetItem(hwndLV, PrItem^) then Break;
        MemMgr.Read(PrItem, Item, SizeOf(TLVItem));
        //Überprüfen, ob Item mit gesuchtem Item übereinstimmt.
        if MemMgr.ReadStr(Item.pszText) = sItemText then
        begin
          //Item "Selected" Eigenschaften setzen
          Item.state := LVIS_SELECTED;
          Item.stateMask := LVIS_SELECTED;
          //Item markieren
          MemMgr.Write(Item, PrItem, SizeOf(TLVItem));
          if Boolean(SendMessage(hwndLV, LVM_SETITEMSTATE, i, LongInt(PrItem))) then
          begin
            //Enter senden
            PostMessage(hwndLV, WM_KEYDOWN, VK_RETURN, 0);
            PostMessage(hwndLV, WM_KEYUP, VK_RETURN, 0);
            Result := True;
          end;
          Break;
        end;
        i := ListView_GetNextItem(hwndLV, i, LVNI_ALL);
    end;
  finally
    MemMgr.Free;
  end;
end;
Thomas
  Mit Zitat antworten Zitat