Вверх ↑
Ответов: 162
Рейтинг: 24
#1: 2021-01-19 22:01:25 ЛС | профиль | цитата
Psaho писал(а):
прошу помощи в получение текста (списка всех строк) из SysListView32 через сообщение окну

Это не так просто сделать как кажется. На форуме выкладывали примеры как получить данные из SysListView32. Вот один из примеров.
Add(MainForm,2953706,28,77)
{
Width=519
Height=612
link(onCreate,11029555:doFor,[])
}
Add(RichEdit,16572225,294,175)
{
Top=504
Width=503
Height=69
Align=4
ModeSp=1
ScrollBars=3
}
Add(Hub,2009082,175,154)
{
link(onEvent1,8093015:doGetListViewHeader,[])
link(onEvent2,8093015:doGetListViewRow,[])
}
Add(Memory,15289948,133,35)
{
Default=String(Edit1;ediT2;edit3)
}
Add(StringTable,14549411,189,91)
{
Width=503
Height=215
Align=2
Columns=#1:1|1:2|1:3|1:4|1:5|
Point(Handle)
}
Add(InlineCode,8093015,203,154)
{
WorkPoints=#19:doGetListViewHeader|16:doGetListViewRow|
EventPoints=#8:onHeader|5:onRow|
DataPoints=#8:inHandle|
Code=#15:unit HiAsmUnit;|0:|9:interface|0:|29:uses kol,windows,Share,Debug;|0:|5:const|27: HDM_FIRST = $1200;|27: LVM_FIRST = $1000;|36: LVM_GETHEADER = LVM_FIRST + 31;|35: HDM_GETITEMCOUNT = HDM_FIRST + 0;|27: HDI_TEXT = $0002;|27: HDF_STRING = $4000;|2: |35: LVM_GETITEMCOUNT = LVM_FIRST + 4;|1: |4:type|19: HD_ITEM = record|19: Mask: Cardinal;|17: cxy: Integer;|23: pszText: PAnsiChar;|17: hbm: HBITMAP;|24: cchTextMax: Integer;|17: fmt: Integer;|19: lParam: LPARAM;|22: iImage: Integer; |22: iOrder: Integer; |7: end; |2: |4:type|18: LV_ITEM = record|15: mask: UINT;|19: iItem: Integer;|22: iSubItem: Integer;|16: state: UINT;|20: stateMask: UINT;|23: pszText: PAnsiChar;|24: cchTextMax: Integer;|20: iImage: Integer;|19: lParam: LPARAM;|21: iIndent: Integer;|8: end; |1: |0:|4:type|28: THiAsmClass = class(TDebug)|10: private|0:|9: public|25: onHeader:THI_Event;|22: onRow:THI_Event;|25: inHandle:THI_Event;|3: |50: procedure GetListViewHeader(ALVHandle: HWND);|47: procedure GetListViewRow(ALVHandle: HWND);|59: procedure doGetListViewHeader(var dt:TData; idx:word);|56: procedure doGetListViewRow(var dt:TData; idx:word);|5: end;|0:|14:implementation|0:|46:function ListView_GetHeader(hwnd: HWND): HWND;|5:begin|51: Result := SendMessage(hwnd, LVM_GETHEADER, 0, 0);|4:end;|0:|52:function Header_GetItemCount(Header: HWnd): Integer;|5:begin|56: Result := SendMessage(Header, HDM_GETITEMCOUNT, 0, 0);|4:end;|0:|79:function Header_GetItem(Header: HWnd; Index: Integer; var Item: HD_ITEM): Bool;|5:begin|76: Result := Bool( SendMessage(Header, HDM_GETITEM, Index, Longint(@Item)) );|4:end;|0:|52:function ListView_GetItemCount(hWnd: HWND): Integer;|5:begin|54: Result := SendMessage(hWnd, LVM_GETITEMCOUNT, 0, 0);|4:end;|0:|42:procedure THiAsmClass.doGetListViewHeader;|18:var hwnd:Cardinal;|5:begin|35: hwnd := ReadInteger(dt,inHandle);|24: if hwnd = 0 then exit;|26: GetListViewHeader(hwnd);|4:end;|0:|39:procedure THiAsmClass.doGetListViewRow;|18:var hwnd:Cardinal;|5:begin|35: hwnd := ReadInteger(dt,inHandle);|24: if hwnd = 0 then exit;|23: GetListViewRow(hwnd);|4:end;|0:|57:procedure THiAsmClass.GetListViewHeader(ALVHandle: HWND);|6:const |49: cchTextMax=148; // максимальная длина заголовка|5:var |20: hProcess: THandle;|21: dwProcessID: DWORD;|18: dwWriten: DWORD;|17: dwCount: DWORD;|17: pszText: PChar;|22: svText: ShortString;|18: HDItem: HD_ITEM;|20: pHDItem: ^HD_ITEM;|29: i, j, nTextLength: Integer;|17: lvHeader: HWND;|14: stmp:string;|5:begin|0:|38: // Получаем хендл заголовка ListView|44: lvHeader := ListView_GetHeader(ALVHandle);|0:|35: // Получаем количество заголовков|43: dwCount := Header_GetItemCount(lvHeader);|27: if dwCount = 0 then Exit;|0:|25: // Получаем ID процесса|19: dwProcessID := 0;|51: GetWindowThreadProcessId(lvHeader, @dwProcessID);|0:|25: if dwProcessID = 0 then|28: ExitProcess(GetLastError);|0:|22: // Открываем процесс|16: hProcess := 0;|65: hProcess := OpenProcess(PROCESS_ALL_ACCESS, True, dwProcessID);|22: if hProcess = 0 then|28: ExitProcess(GetLastError);|0:|48: // Выделяем в нем память под текстовый буффер |54: pszText := VirtualAllocEx(hProcess, nil, cchTextMax,|72: MEM_COMMIT or MEM_TOP_DOWN, PAGE_READWRITE);|48: // Выделяем в нем память под структуру HDITEM|59: pHDItem := VirtualAllocEx(hProcess, nil, SizeOf(HD_ITEM),|72: MEM_COMMIT or MEM_TOP_DOWN, PAGE_READWRITE);|0:|24: // Заполняем структуру|39: ZeroMemory(@HDItem, SizeOf(HD_ITEM));|26: HDItem.mask := HDI_TEXT;|28: HDItem.pszText := pszText;|34: HDItem.cchTextMax := cchTextMax;|0:|45: // Заполняем информацию о каждом заголовке.|30: for i := 0 to dwCount - 1 do|7: begin|0:|41: // Пишем в память удалённого процесса|57: if not WriteProcessMemory(hProcess, pHDItem, @HDItem,|57: SizeOf(HD_ITEM), dwWriten) then Exit;|0:|30: // Получаем итем заголовка|60: SendMessage(lvHeader, HDM_GETITEM, i, Longint(pHDItem));|0:|23: // Читаем заголовки|36: ZeroMemory(@svText, cchTextMax);|66: if not ReadProcessMemory(hProcess, HDItem.pszText, @svText[1],|54: cchTextMax, dwWriten) then Exit;|22: |30: // Выодим их из переменной|44: _hi_onEvent(onHeader,PChar(@svText[1]));|6: end;|0:|34: // Освобождаем выделенную память|51: VirtualFreeEx(hProcess, pszText, 0, MEM_RELEASE);|51: VirtualFreeEx(hProcess, pHDItem, 0, MEM_RELEASE);|0:|33: // Закрываем описатель процесса|24: CloseHandle(hProcess);|4:end;|0:|0:|54:procedure THiAsmClass.GetListViewRow(ALVHandle: HWND);|5:const|17: cchTextMax=255;|3:var|20: hProcess: THandle;|21: dwProcessID: DWORD;|18: dwWriten: DWORD;|32: LVItemCount, dwCount: Integer;|29: i, j, nTextLength: Integer;|20: pLVItem: ^LV_ITEM;|18: LVItem: LV_ITEM;|17: pszText: PChar;|22: svText: ShortString;|14: sTmp:string;|17: lvHeader: HWND;|5:begin|29: if ALVHandle = 0 then Exit;|30: // Получаем количество строк|52: LVItemCount := ListView_GetItemCount(ALVHandle); |38: // Получаем хендл заголовка ListView|44: lvHeader := ListView_GetHeader(ALVHandle);|35: // Получаем количество заголовков|44: dwCount := Header_GetItemCount(lvHeader); |2: |62: // Получаем ID процесса, которому принадлежит найденное окно|19: dwProcessID := 0;|52: GetWindowThreadProcessId(ALVHandle, @dwProcessID);|24: if dwProcessID = 0 then|28: ExitProcess(GetLastError);|22: // Открываем процесс|16: hProcess := 0;|65: hProcess := OpenProcess(PROCESS_ALL_ACCESS, True, dwProcessID);|22: if hProcess = 0 then|28: ExitProcess(GetLastError);|47: // Выделяем в нем память под текстовый буффер|54: pszText := VirtualAllocEx(hProcess, nil, cchTextMax,|72: MEM_COMMIT or MEM_TOP_DOWN, PAGE_READWRITE);|47: // Выделяем в нем память под структуру LVITEM|59: pLVItem := VirtualAllocEx(hProcess, nil, SizeOf(LV_ITEM),|81: MEM_COMMIT or MEM_TOP_DOWN, PAGE_READWRITE);|0:|24: // Заполняем структуру|39: ZeroMemory(@LVItem, SizeOf(LV_ITEM));|27: LVItem.mask := LVIF_TEXT;|28: LVItem.pszText := pszText;|34: LVItem.cchTextMax := cchTextMax;|0:|21: // Считываем строки|34: for i := 0 to LVItemCount - 1 do|7: begin|25: LVItem.iSubItem := 0;|44: // Пишем ее в память удаленного процесса|57: if not WriteProcessMemory(hProcess, pLVItem, @LVItem,|54: SizeOf(LV_ITEM), dwWriten) then Exit;|58: nTextLength := SendMessage(ALVHandle, LVM_GETITEMTEXT,|52: i, Integer(pLVItem));|23: // Читаем результат|36: ZeroMemory(@svText, cchTextMax);|59: ReadProcessMemory(hProcess, LVItem.pszText, @svText[1],|46: nTextLength, dwWriten);|4: |35: sTmp := ''; |42: sTmp := PChar(@svText[1]); |0:|22: //Считываем столбцы|31: for j := 1 to dwCount - 1 do|9: begin|27: LVItem.iSubItem := j;|46: // Пишем ее в память удаленного процесса|59: if not WriteProcessMemory(hProcess, pLVItem, @LVItem,|69: SizeOf(LV_ITEM), dwWriten) then Exit;|60: nTextLength := SendMessage(ALVHandle, LVM_GETITEMTEXT,|54: i, Integer(pLVItem));|25: // Читаем результат|38: ZeroMemory(@svText, cchTextMax);|49: ReadProcessMemory(hProcess, LVItem.pszText,|59: @svText[1], nTextLength, dwWriten);|26: // добавляем столбцы|45: sTmp := sTmp + ';' + PChar(@svText[1]);|8: end;|29: _hi_onEvent(onRow, sTmp);|6: end;|0:|40: // Освобождаем ранее выделенную память|51: VirtualFreeEx(hProcess, pszText, 0, MEM_RELEASE);|51: VirtualFreeEx(hProcess, pLVItem, 0, MEM_RELEASE);|33: // Закрываем описатель процесса|24: CloseHandle(hProcess);|4:end;|0:|4:end.|
link(onHeader,2614112:doAddColumn,[])
link(onRow,954867:doEvent1,[])
link(inHandle,14549411:Handle,[])
}
Add(For,11029555,77,91)
{
Start=1
End=100
link(onEvent,10677756:doString,[])
}
Add(FormatStr,10677756,126,91)
{
Mask="%1;%2"
link(onFString,14549411:doAdd,[])
link(Str2,15289948:Value,[])
}
Add(Button,8681122,126,154)
{
Top=215
Width=503
Align=2
link(onClick,2009082:doEvent1,[])
}
Add(Hub,954867,259,161)
{
link(onEvent1,2614112:doAdd,[(284,167)(284,139)])
link(onEvent2,16572225:doAdd,[(284,174)(284,181)])
}
Add(StringTable,2614112,294,133)
{
Top=235
Width=503
Height=269
Align=5
Columns=#1:1|1:2|1:3|1:4|1:5|
Point(Handle)
Point(doAddColumn)
}


Также выкладываю пример того, как можно получить эти данные зная только текст заголовка окна.
https://forum.hiasm.com/getfile/39205
Документация к ManagedWinapi.dll http://mwinapi.sourceforge.net/doc/index.html

Схема проверялась только на Window10(powershell-5.1)
карма: 4

0
файлы: 1read SysListView32.zip [46.5KB] [109]
Редактировалось 2 раз(а), последний 2021-01-20 08:32:44