Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Проблема чтения списка из чужого окна в 64-bit OS


JustBeginner ©   (2014-07-12 14:28:00) 

Привет! Процедура проверяет открыто ли окно Диспетчера задач, и если открыто - считывает из него список процессов в мой 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;


oldman   (2014-07-13 11:12:00) [1]


> Надо получить список имен процессов именно в той самой последовательности
> что и в диспетчере задач


НА ФИГА?????????????????????


Styx   (2014-07-12 20:19:00) [2]


> Делать всю программу 64-битной только из-за одной процедуры
> не вариант

Делать скриншот и OCR-ить ;-)


JustBeginner   (2014-07-12 18:48:00) [3]

Делать всю программу 64-битной только из-за одной процедуры не вариант (

Надо получить список имен процессов именно в той самой последовательности что и в диспетчере задач (т.е. с той же сортировкой)


Styx   (2014-07-12 18:27:00) [4]

Сделать Вашу программу 64-битной. А к чему вообще этот код, почему не получать список самому?


Наверх

Титульная страница Поиск, карта сайта Написать письмо