![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Очень нужен рабочий пример чтения этого компонента в чужом приложении по хэндлу окна и запись в свой listbox! help help help!
|
|
#2
|
||||
|
||||
|
http://narod.ru/disk/20260251001/DoS...iew32.dcu.html
Код:
uses
DoSysListView32,
var
hListView: THandle;
begin
hListView:=FindWindow('Progman', 'Program Manager');
if hListView<>0 then
begin
hListView:=FindWindowEx(hListView, 0, 'SHELLDLL_DefView', nil);
if hListView<>0 then
hListView:=FindWindowEx(hListView, 0, 'SysListView32', 'FolderView');
end;
if hListView<>0 then
begin
FillSysListView32(hListView, ListBox.Items);
end;
end; |
|
#3
|
|||
|
|||
|
прошу прощения, перепутал со StringGrid....и можно плиз такие исходники не кидать
Код:
'Я Bgь>Ѓ^с – <pDoSysListView32.pasgь> dClassesИCТп ' |
|
#4
|
||||
|
||||
|
исходника никто и не кидал, это выложен скомпилированый модуль, чтобы не напрягать пользователей изучением принципа его работы, а дать время почитать книжку по Delphi и изучить что такое dcu файл, который содержит в себе функцию:
Код:
procedure FillSysListView32(hListView: THandle; AStrings: TStrings); |
|
#5
|
|||
|
|||
|
тогда выложу исходник за тебя
Код:
procedure GetViewGrid(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;но у меня не получаеться в нем разобраться, может кто нить поможет скомпилировать нормальный рабочий код который читает syslistview32 и пишет все в StringGrid Спасибо |
|
#6
|
||||
|
||||
|
http://narod.ru/disk/20273687001/DoS...iew32.dcu.html
Код:
uses
DoSysListView32,
procedure TForm1.FormCreate(Sender: TObject);
var
hListView: THandle;
// AStringList: TStringList;
begin
hListView:=FindWindow('Progman', 'Program Manager');
if hListView<>0 then
begin
hListView:=FindWindowEx(hListView, 0, 'SHELLDLL_DefView', nil);
if hListView<>0 then
hListView:=FindWindowEx(hListView, 0, 'SysListView32', 'FolderView');
end;
if hListView<>0 then
begin
FillSysListView32(hListView, StringGrid1);
// AStringList:=TStringList.Create;
// FillSysListView32(hListView, AStringList);
// AStringList.Free;
end;
end; |