Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2010.01.24;
Скачать: [xml.tar.bz2];

Вниз

Как прочитать содержимое 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.127 c
2-1251710046
Zalm
2009-08-31 13:14
2010.01.24
TIdCmdTCPServer


2-1259929176
oleg1963lora
2009-12-04 15:19
2010.01.24
CreateDir. Анализ ошибки


4-1227216337
demon
2008-11-21 00:25
2010.01.24
Количество Items на помещаеться


11-1210487732
=BuckLr=
2008-05-11 10:35
2010.01.24
Скрыть каретку в richedit НАПРОЧЬ


1-1228253040
asail
2008-12-03 00:24
2010.01.24
Не рабтает смена лотка в QuickReport





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский