uses
CommCtrl, uProcessMemMgr
{siehe Anhang};
function LVDblClickItemByIndex(hwndLV: HWND; ItemIndex: Word): Boolean;
// Führt einen Doppelklick (Enter) auf ein Item in einer fremden ListView aus
// hwndLV: Handle der ListView
// ItemIndex: Index des Items, angefangen bei 0
// Diese Methode funktioniert u.U nur, wenn kein anderes Item markiert ist.
const
MaxTextLen = 1024;
var
MemMgr: TProcessMemMgr;
LVItem: TLVItem;
iLVitemsCount: Integer;
PrItem: PLVItem;
begin
Result := False;
MemMgr := CreateProcessMemMgrForWnd(hwndLV);
try
PrItem := MemMgr.AllocMem(SizeOf(TLVItem));
iLVitemsCount := ListView_GetItemCount(hwndLV);
if ItemIndex < iLVitemsCount
then
begin
FillChar(LVItem, SizeOf(LVItem), 0);
// Item Eigenschaften setzen
LVItem.mask := LVIF_TEXT;
LVItem.iItem := ItemIndex;
MemMgr.
Write(LVItem, PrItem, SizeOf(TLVItem));
if not ListView_GetItem(hwndLV, PrItem^)
then Exit;
MemMgr.
Read(PrItem, LVItem, SizeOf(TLVItem));
if ListView_GetItem(hwndLV, PrItem^)
then
begin
// Item "Selected" Eigenschaften setzen
LVItem.state := LVIS_SELECTED;
LVItem.stateMask := LVIS_SELECTED;
// Item markieren
MemMgr.
Write(LVItem, PrItem, SizeOf(TLVItem));
if Boolean(SendMessage(hwndLV, LVM_SETITEMSTATE, ItemIndex, LongInt(PrItem)))
then
begin
// Enter senden
PostMessage(hwndLV, WM_KEYDOWN, VK_RETURN, 0);
PostMessage(hwndLV, WM_KEYUP, VK_RETURN, 0);
// SendMessage(hwndLV, WM_LBUTTONDBLCLK, ItemNumber, LongInt(PrItem));
Result := True;
end;
end;
end;
finally
MemMgr.Free;
end;
end;