Chertenok.ru - все о программировании
Вход  |  Регистрация  |  Поиск 
Праздник
Сегодня :

День славянской письменности и культуры


список процессов


Новая тема  Ответить  Печать Предыдущая тема  Следующая тема
Автор Сообщение
Анатолий
Гость







СообщениеПт, 16-Авг-2002 16:59    Заголовок сообщения: список процессов
Цитата

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


Возраст: 31
Знак зодиака: Лев
Зарегистрирован: 02.05.2002
Сообщения: 5709
Откуда: Донецк
СообщениеПт, 16-Авг-2002 21:14 
Цитата

Вариантов много. Если мозги компьютера забиты чем-то вроде 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

_________________
Да пребудет с вами Сила!
В начало
Посмотреть профиль Отправить личное сообщение
Показать сообщения:   
Страница 1 из 1
Перейти:  
Новая тема  Ответить  Печать

Вы можете начинать темы
Вы можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете присоединять файлы в этом форуме
Вы можете скачивать файлы в этом форуме
хостинг от .masterhost 
Rambler's Top100