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;