
12.07.2014, 14:24
|
Прохожий
|
|
Регистрация: 12.07.2014
Сообщения: 1
Версия Delphi: Delphi 7
Репутация: 10
|
|
Проблема чтения списка из чужого окна в 64-bit OS
Добрый день! Процедура проверяет открыто ли окно Диспетчера задач, и если открыто - считывает из него список процессов в мой Memo1.
Процедура получения списка процессов приведена ниже.
На 32-битной семерке работает отлично, а на 64 - сам диспетчер задач просто закрывается с ошибкой "Прекращена работа программы Диспечер задач Windows".
Подскажите, что нужно исправить чтобы работало на Windows 7 64-bit?
Код:
procedure UpdateList();
var
i:integer;
Amount: Integer;
buf: array [0..255] of Char;
PID, ProcessHandle, Dummy: DWORD;
PCh: PChar;
PItem: ^LV_ITEM;
Item: LV_ITEM;
h: THandle;
begin
h:=FindWindow(nil,'Диспетчер задач Windows');
h:=FindWindowEx(h,0,nil,'Процессы');
h:=FindWindowEx(h,0,'SysListView32',nil);
if h = 0 then Exit;
GetWindowThreadProcessID(h, @PID);
ProcessHandle := OpenProcess(PROCESS_ALL_ACCESS, False, PID);
PCh := VirtualAllocEx(ProcessHandle, nil, 255, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
PItem := VirtualAllocEx(ProcessHandle, nil, SizeOf(LV_ITEM), MEM_COMMIT, PAGE_EXECUTE_READWRITE);
Amount := ListView_GetItemCount(h);
for I := 0 to Amount do
begin
Item.mask := LVIF_TEXT;
Item.iItem := I;
Item.iSubItem := 0;
Item.pszText := PCh;
Item.cchTextMax := SizeOf(buf);
WriteProcessMemory(ProcessHandle, PItem, @Item, sizeOf(Item), Dummy);
if ListView_GetItem(h, PItem^) then
begin
ReadProcessMemory(ProcessHandle, PCh, @buf, 255, Dummy);
Memo1.Lines.Add(buf); // получаем информацию в Memo1
end;
end;
VirtualFreeEx(ProcessHandle, PCh, 0, MEM_RELEASE);
VirtualFreeEx(ProcessHandle, PItem, 0, MEM_RELEASE);
CloseHandle(ProcessHandle);
end;
|