Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.01.24;
Скачать: CL | DM;

Вниз

Как прочитать содержимое ListView с помощью WinApi?   Найти похожие ветки 

 
Васлий Метелкин   (2009-12-06 10:40) [0]

Здравствуйте. Известен хэндл окна, вызываю EnumChildWindows и нахожу ListView...
А дальше что? GetWindowText и SendMessage(...WM_GETTEXT...) возращают пустую строку.  Как прочитать содержимое колонок?


 
DVM ©   (2009-12-06 10:46) [1]


> Васлий Метелкин

Если это чужое окно, то сие подробно было расписано в книге Рихтера, в главе , где он управлял иконками рабочего стола.


 
Васлий Метелкин   (2009-12-06 10:49) [2]


> DVM ©   (06.12.09 10:46) [1]

> Если это чужое окно, то сие подробно было расписано в книге
> Рихтера, в главе , где он управлял иконками рабочего стола.
>

А в какой именно книге?


 
DVM ©   (2009-12-06 10:53) [3]


> Васлий Метелкин   (06.12.09 10:49) [2]

Вот на делфи, у Рихтера там по сути почти так же:

////////////////////////////////////////////////////////////////////////////////
//
//  ****************************************************************************
//  * Unit Name : RemoteSysListView32
//  * Purpose   : Демо работы с удаленным SysListView32
//  * Author    : Александр (Rouse_) Багель
//  * Copyright : © Fangorn Wizards Lab 1998 - 2007
//  * Version   : 1.01
//  * Home Page : http://rouse.drkb.ru
//  ****************************************************************************
//

program RemoteSysListView32;

{$APPTYPE CONSOLE}

uses
Windows,
SysUtils,
CommCtrl;

var
hwndRemoteSysListView: HWND = 0;
hProcess: THandle = 0;
dwProcessID: DWORD = 0;
dwBytesWriten: DWORD;
nItemCount: Integer = 0;
I, nTextLength: Integer;
cchTextMax: Integer = 255;
plviRemoteLVItem: PLVItem = nil;
lviRemoteLVItem: LV_ITEM;
pszText: PChar = nil;
svText: ShortString;
ARect: TRect;
pRemoteRect: Pointer = nil;

function GetFirstChild(hwndValue: HWND): HWND;
begin
  Result := GetWindow(hwndValue, GW_CHILD);
end;

function Translate(Value: String): String;
begin
  SetLength(Result, Length(Value));
  AnsiToOem(@Value[1], @Result[1]);
end;

begin
// Ищем SysListView32 рабочего стола
hwndRemoteSysListView := GetFirstChild(GetFirstChild(FindWindow("ProgMan", nil)));
if hwndRemoteSysListView = 0 then ExitProcess(GetLastError);

// Получаем количество элементов (ярлыков на рабочем столе)
nItemCount := ListView_GetItemCount(hwndRemoteSysListView);

// Получаем ID процесса, которому принадлежит найденное окно
GetWindowThreadProcessId(hwndRemoteSysListView, @dwProcessID);
if dwProcessID = 0 then ExitProcess(GetLastError);

// Открываем процесс
hProcess := OpenProcess(PROCESS_ALL_ACCESS, TRUE, dwProcessID);
if hProcess = 0 then ExitProcess(GetLastError);

// Выделяем в нем память под текстовый буффер
pszText := VirtualAllocEx(hProcess, nil, cchTextMax,
 MEM_COMMIT or MEM_TOP_DOWN, PAGE_READWRITE);
if GetLastError <> 0 then ExitProcess(GetLastError);

// Выделяем в нем память под структуру LVITEM
plviRemoteLVItem := VirtualAllocEx(hProcess, nil, SizeOf(LV_ITEM),
 MEM_COMMIT or MEM_TOP_DOWN, PAGE_READWRITE);
if GetLastError <> 0 then ExitProcess(GetLastError);

// Заполняем структуру
ZeroMemory(@lviRemoteLVItem, SizeOf(LV_ITEM));
lviRemoteLVItem.mask := LVIF_TEXT;
lviRemoteLVItem.pszText := pszText;
lviRemoteLVItem.cchTextMax := cchTextMax;

// Пишем ее в память удаленного процесса
if not WriteProcessMemory(hProcess, plviRemoteLVItem, @lviRemoteLVItem,
  SizeOf(LV_ITEM), dwBytesWriten) then ExitProcess(GetLastError);

// Выделяем в нем память под структуру TRect
pRemoteRect := VirtualAllocEx(hProcess, nil, SizeOf(TRect),
 MEM_COMMIT or MEM_TOP_DOWN, PAGE_READWRITE);
if GetLastError <> 0 then ExitProcess(GetLastError);

// Получаем текст со всех элементов
for I := 0 to nItemCount - 1 do
begin
  // Отправляем сообщение с указателем на выделенный буффер под LVITEM
  nTextLength := SendMessage(hwndRemoteSysListView, LVM_GETITEMTEXT,
    I, Integer(plviRemoteLVItem));

  // Читаем результат
  ZeroMemory(@svText, cchTextMax);
  ReadProcessMemory(hProcess, lviRemoteLVItem.pszText,
    @svText[1], nTextLength, dwBytesWriten);

  // Чтобы получить координаты каждого элемента нужно подготовить структуру
  ZeroMemory(@ARect, SizeOf(TRect));
  ARect.Left := LVIR_ICON;
  if not WriteProcessMemory(hProcess, pRemoteRect, @ARect,
    SizeOf(TRect), dwBytesWriten) then ExitProcess(GetLastError);

  // Посылаем сообщение для получения координат каждого элемента
  SendMessage(hwndRemoteSysListView, LVM_GETITEMRECT,
    I, Integer(pRemoteRect));

  // Читаем результат
  ReadProcessMemory(hProcess, pRemoteRect,
    @ARect, SizeOf(TRect), dwBytesWriten);

  Writeln(Translate(PChar(@svText[1])));
  Writeln(Translate(
    Format("- координаты: Left = %d, Top = %d, Right = %d, Bottom = %d",
      [ARect.Left, ARect.Top, ARect.Right, ARect.Bottom])));

end;

// Освобождаем ранее выделенную память
VirtualFreeEx(hProcess, pszText, 0, MEM_RELEASE);
VirtualFreeEx(hProcess, plviRemoteLVItem, 0, MEM_RELEASE);

// Закрываем описатель процесса
CloseHandle(hProcess);

Readln;
end.


 
Васлий Метелкин   (2009-12-06 10:54) [4]


> DVM ©   (06.12.09 10:53) [3]

Спсибо. Буду разбираться.


 
DVM ©   (2009-12-06 10:54) [5]


> А в какой именно книге?

"Windows для профессионалов"



Страницы: 1 вся ветка

Текущий архив: 2010.01.24;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.008 c
1-1233591166
Wadimka
2009-02-02 19:12
2010.01.24
Как защитить свою прогу? вернее, через сервер


2-1259755341
Andjey
2009-12-02 15:02
2010.01.24
Получение хэндла потока


2-1258096612
xtd
2009-11-13 10:16
2010.01.24
почему в TWebBrowser не работает JavaScript ?


2-1259911372
kate158
2009-12-04 10:22
2010.01.24
отображение в поле monthcalendar только месяца и года


2-1259714074
Восьмой
2009-12-02 03:34
2010.01.24
Латышский язык