Последние записи
- Преобразовать массив байт в вещественное число (single)
- TChromium (CEF3), сохранение изображений
- Как в Delphi XE обнулить таймер?
- Изменить цвет шрифта TextBox на форме
- Ресайз PNG без потери прозрачности
- Вывод на печать графического файла
- Взаимодействие через командную строку
- Перенести программу из Delphi в Lazarus
- Определить текущую ОС
- Автоматическая смена языка (раскладки клавиатуры)
Интенсив по Python: Работа с API и фреймворками 24-26 ИЮНЯ 2022. Знаете Python, но хотите расширить свои навыки?
Slurm подготовили для вас особенный продукт! Оставить заявку по ссылке - https://slurm.club/3MeqNEk
Online-курс Java с оплатой после трудоустройства. Каждый выпускник получает предложение о работе
И зарплату на 30% выше ожидаемой, подробнее на сайте академии, ссылка - ttps://clck.ru/fCrQw
8th
Авг
Пример считывания с чужого листа ListView или syslistview32 в свой TStringGrid
Posted by Chas under Delphi
Нужно прочитать syslistview32 в чужом приложении и записать в свой
Aliens_wolfs
Пример считывания с чужого листа ListView или syslistview32 в свой TStringGrid, можешь и под listbox сделать все в ваших руках.
Я даже рабочий стол считал этой функцией
1. К проекту добавить юнит:
uses
CommCtrl;
2. Вставь в форму TStringGrid
3. Перенести этот код к себе в проект
procedure GetListViewGrid(ALVHandle: HWND; AColumnCount, AItemCount: Integer; ADataGrid: TStringGrid);
const
cchTextMax=255;
var
hProcess: THandle;
dwProcessID: DWORD;
dwWriten: DWORD;
LVItemCount: Integer;
i, j, nTextLength: Integer;
pLVItem: ^LV_ITEM;
LVItem: LV_ITEM;
pszText: PChar;
svText: ShortString;
begin
if ALVHandle = 0 then Exit;
// Получаем количество строк
LVItemCount := ListView_GetItemCount(ALVHandle);
if AItemCount > LVItemCount then exit;
if AItemCount > 0 then LVItemCount:=AItemCount;
//Получаем ID процесса, которому принадлежит найденное окно
dwProcessID := 0;
GetWindowThreadProcessId(ALVHandle, @dwProcessID);
if dwProcessID = 0 then
ExitProcess(GetLastError);
// Открываем процесс
hProcess := 0;
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);
// Выделяем в нем память под структуру LVITEM
pLVItem := VirtualAllocEx(hProcess, nil, SizeOf(LV_ITEM),
MEM_COMMIT or MEM_TOP_DOWN, PAGE_READWRITE);
//Устанавливаем колич строк и столбцов в TStringGrid
ADataGrid.RowCount := LVItemCount ;
ADataGrid.ColCount := AColumnCount ;
// Заполняем структуру
ZeroMemory(@LVItem, SizeOf(LV_ITEM));
LVItem.mask := LVIF_TEXT;
LVItem.pszText := pszText;
LVItem.cchTextMax := cchTextMax;
//Считываем строки
for i := 0 to LVItemCount - 1 do
begin
LVItem.iSubItem := 0;
// Пишем ее в память удаленного процесса
if not WriteProcessMemory(hProcess, pLVItem, @LVItem,
SizeOf(LV_ITEM), dwWriten) then Exit;
nTextLength := SendMessage(ALVHandle, LVM_GETITEMTEXT,
i, Integer(pLVItem));
// Читаем результат
ZeroMemory(@svText, cchTextMax);
ReadProcessMemory(hProcess, LVItem.pszText, @svText[1],
nTextLength, dwWriten);
//заполняем строки TStringGrid
ADataGrid.Cells[1, i + 1] := StrPas(PChar(@svText[1]));
//Считываем столбцы
for j := 0 to AColumnCount - 1 do
begin
LVItem.iSubItem := j;
// Пишем ее в память удаленного процесса
if not WriteProcessMemory(hProcess, pLVItem, @LVItem,
SizeOf(LV_ITEM), dwWriten) then Exit;
nTextLength := SendMessage(ALVHandle, LVM_GETITEMTEXT,
i, Integer(pLVItem));
// Читаем результат
ZeroMemory(@svText, cchTextMax);
ReadProcessMemory(hProcess, LVItem.pszText,
@svText[1], nTextLength, dwWriten);
//заполняем столбцы TStringGrid
ADataGrid.Cells[j + 1, i + 1] := StrPas(PChar(@svText[1]));
end;
end;
// Освобождаем ранее выделенную память
VirtualFreeEx(hProcess, pszText, 0, MEM_RELEASE);
VirtualFreeEx(hProcess, pLVItem, 0, MEM_RELEASE);
// Закрываем описатель процесса
CloseHandle(hProcess);
end;
4. Использовать так:
ALVHandle: это дескриптор листа которого нужно захватить syslistview32
AColumnCount: количество столбцов
AItemCount: количество строк если поставить значение 0 то прочитает все строки.
ADataGrid: это твой грид на твоей форме в котором будут отображаться строки с чужого ListView.
procedure TForm1.Button1Click(Sender: TObject);
begin
GetListViewGridData(ALVHandle, 10, 0, StringGrid1);
end;
Похожие статьи
Купить рекламу на сайте за 1000 руб
пишите сюда - alarforum@yandex.ru
Да и по любым другим вопросам пишите на почту
пеллетные котлы
Пеллетный котел Emtas
Наши форумы по программированию:
- Форум Web программирование (веб)
- Delphi форумы
- Форумы C (Си)
- Форум .NET Frameworks (точка нет фреймворки)
- Форум Java (джава)
- Форум низкоуровневое программирование
- Форум VBA (вба)
- Форум OpenGL
- Форум DirectX
- Форум CAD проектирование
- Форум по операционным системам
- Форум Software (Софт)
- Форум Hardware (Компьютерное железо)