Главная страница
    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.005 c
2-1259791180
kolj
2009-12-03 00:59
2010.01.24
Проблемы с ClientDataSet


15-1258742459
POOP
2009-11-20 21:40
2010.01.24
Djvu просмоторщик для мобильника?


1-1234441892
Tack
2009-02-12 15:31
2010.01.24
Неразрывный пробел в RichEdit


2-1259665917
Xmen
2009-12-01 14:11
2010.01.24
Доступ к папкам через сеть


2-1260029047
Danco
2009-12-05 19:04
2010.01.24
TPopumMenu и TButton





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский