Показать сообщение отдельно
  #44  
Старый 01.05.2009, 15:07
Nyctos Kasignete Nyctos Kasignete вне форума
Активный
 
Регистрация: 29.03.2009
Сообщения: 300
Репутация: 94
По умолчанию

Вот так можно отослать двойной клик по нужному Item'у... (Я опять же воспользовалась примером из этой темы...)
Код:
procedure SendDblClick(ListViewHandle: HWND; ItemIndex: Integer);
// ItemIndex — порядковый номер Item'а, начиная с нуля
var
  hProcess: THandle;
  dwProcessID: DWORD;
  dwBytesWriten: DWORD;
  ARect: TRect;
  pRemoteRect: Pointer;
begin
  SelectItemN(ListViewHandle, ItemIndex); // эта процедура описана ранее — в посте #35
  GetWindowThreadProcessId(ListViewHandle, @dwProcessID);
  if dwProcessID = 0 then Exit;
  hProcess := OpenProcess(PROCESS_ALL_ACCESS, True, dwProcessID);
  if hProcess = 0 then Exit;

  pRemoteRect := VirtualAllocEx(hProcess, nil, SizeOf(TRect),
                                MEM_COMMIT or MEM_TOP_DOWN, PAGE_READWRITE);
  if GetLastError <> 0 then Exit;

  ZeroMemory(@ARect, SizeOf(TRect));
  ARect.Left := LVIR_BOUNDS;
  if not WriteProcessMemory(hProcess, pRemoteRect, @ARect,
                            SizeOf(TRect), dwBytesWriten) then Exit;
  SendMessage(ListViewHandle, LVM_GETITEMRECT, ItemIndex, Integer(pRemoteRect));

  ReadProcessMemory(hProcess, pRemoteRect, @ARect, SizeOf(TRect), dwBytesWriten);
  SetCapture(ListViewHandle);
  SendMessage(ListViewHandle, WM_LBUTTONDBLCLK, MK_LBUTTON,
              MakeLParam(ARect.Left + 5, ARect.Top + 5));
  ReleaseCapture();
  VirtualFreeEx(hProcess, pRemoteRect, 0, MEM_RELEASE);
  CloseHandle(hProcess);
end;
Там, где стоят пятерки (при отсылке сообщения WM_LBUTTONDBLCLK), — это так, ориентировочно. Это чтобы "щелкать" двойным кликом не по самой границе, очерчивающей Item, а именно по самому Item'у. =)
Пример использования:
Код:
procedure TForm1.Button1Click(Sender: TObject);
begin
  SendDblClick(Handle_of_ListView, 3); // дважды кликаем по четвертому Item'у
end;

_____________
P.S. Кстати, в сообщении #35 я слегка опечаталась. Раньше в процедуре SelectItemN было так:
Цитата:
Сообщение от Nyctos Kasignete
Код:
state := LVIS_SELECTED or LVIS_SELECTED;
X)) А надо так:
Код:
state := LVIS_FOCUSED or LVIS_SELECTED;
Это чтобы нужный Item не только становился выделенным, но и получал фокус. Но я уже исправила там.

P.P.S. На последний вопрос пусть вам кто-нибудь другой ответит.
Ответить с цитированием