![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проблема чтения списка из чужого окна в 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-битной. А к чему вообще этот код, почему не получать список самому?