| Автор
| Сообщение |
|
|
|
Цитата |
|
Как получить список всех процесов? ProcessViewer о котором говорилось в этом форуме не канает. Мне надо получить список всех процессов. Получить файл, который вызвал конкретный процесс, потом получить его главную форму, если такова имеется, и если имеется то сделать ее авктивной. |
|
| В начало |
|
 |
|
|
 |
DrPass
Знающий :) /Почетный Модератор/

Возраст: 31
Знак зодиака: 
Зарегистрирован: 02.05.2002
Сообщения: 5709
Откуда: Донецк
|
|
|
Цитата |
|
Вариантов много. Если мозги компьютера забиты чем-то вроде Windows9x/ME, правда, все варианты сводятся к одному - функциям ToolsAPI:
| Код: | var
pe:TProcessEntry32;
snap:THandle;
...
snap:=CreateToolhelp32Snapshot(th32cs_snapprocess, 0);
pe.dwSize:=sizeof(pe);
if Process32First(snap, pe) then
// в структуре pe теперь хранится инфомация о процессе - делай с ней, чего тебе нужно
until not Process32Next(snap, pe) | На WindowsNT4, наоборот, ToolsAPI не действует. Зато на Windows 2000/XP есть целых три варианта: кроме ToolsAPI можно использовать NT-шную PSAPI и (самый крутой, хакерский вариант) - NativeAPI:
| Код: | type
TFileTime = record
Hi, Lo: DWORD;
end;
type
PThreadInformation = ^TThreadInformation;
TThreadInformation = record
ProcessorTime: TFileTime;
unk2, unk3: cardinal;
CreateTime: TFileTime;
unk6: cardinal;
StartAddress: cardinal;
ProcessID: cardinal;
ThreadID: cardinal;
CurrentPriority: cardinal;
BasePriority: cardinal;
ContextSwitchesPerSec: cardinal;
ThreadState: cardinal;
ThreadWaitReason: cardinal;
unk15: cardinal;
end;
PProcessInformation = ^TProcessInformation;
TProcessInformation = record
NextOffset: cardinal; // следующий процесс
ThreadCount: cardinal;
unk2, unk3, unk4, unk5, unk6, unk7: cardinal;
CreateTime: TFileTime;
UserTime: TFileTime;
KernelTime: TFileTime;
unk14: cardinal;
pModuleName: PWideChar; //* unicode */
BasePriority: cardinal;
ProcessID: cardinal;
InheritedFromUniqueProcessID: cardinal;
HandleCount: cardinal;
unk20, unk21: cardinal;
PeekVirtualSize: cardinal;
VirtualSize: cardinal;
PageFaultCountPerSec: cardinal;
PeakWorkingSetSize: cardinal;
WorkingSetSize: cardinal;
PeekPagedPoolUsage: cardinal;
PagedPoolUsage: cardinal;
PeekNonPagedPoolUsage: cardinal;
NonPagedPoolUsage: cardinal;
unk31: cardinal; //* PagefileUsage ? */
PeakPagefileUsage: cardinal;
unk33: cardinal; //* PrivateBytes ? */
ThreadInfos: PThreadInformation; // потоки данного процесса
end;
type
TNtQuerySystemInformation=function(
TInfo:integer; // тип информации
SystemInformation: pointer; // указатель на буфер
SystemInformationLength: integer; // размер буфера в байтах
var ReturnLength: integer // указатель на 32-битное число
): cardinal;stdcall;
var
NtQuerySystemInformation: TNtQuerySystemInformation;
i:integer;
proc:PProcessInformation;
icon: TIcon;
li: TListItem;
num:integer;
p:pointer;
begin
@NtQuerySystemInformation:=GetProcAddress(GetModuleHandle('ntdll.dll'), 'NtQuerySystemInformation');
if assigned(@NtQuerySystemInformation) then begin
GetMem(p, 30000);
proc:=p;
NtQuerySystemInformation(5, proc, 30000,i);
while true do begin
//в proc - все о процессе
if proc^.NextOffset=0 then break;
proc:=pointer(cardinal(proc)+proc^.NextOffset);
end;
FreeMem(p, 30000);
end;
end; |
Этот код я выдрал из одной своей старой проги, так что не пугайтесь
PSAPI, конечно, попроще в использовании. Но зато не так круто.
Чтобы получить дескрипторы окон потока (формы - это только в Delphi-прогах!), нужно воспользоваться функцией EnumThreadWindows, чтобы сделать окно активным, то SetForegroundWindow _________________ Да пребудет с вами Сила! |
|
| В начало |
|
 |
|