Поймать запуск приложений - PullRequest
1 голос
/ 26 ноября 2009

Как отловить запуск и завершение приложений (процессов) в Win. Как измерить время каждого приложения?

Ответы [ 5 ]

3 голосов
/ 26 ноября 2009

Вы можете использовать функцию GetProcessTimes , чтобы получить информацию о времени для определенного процесса.

BOOL WINAPI GetProcessTimes(
  __in   HANDLE hProcess,
  __out  LPFILETIME lpCreationTime,
  __out  LPFILETIME lpExitTime,
  __out  LPFILETIME lpKernelTime,
  __out  LPFILETIME lpUserTime
);

См. Этот пример

program GetProcessTime;

{$APPTYPE CONSOLE}

uses
  DateUtils,
  Windows,
  tlhelp32,
  SysUtils;


Procedure  GetAllProcessTime;
var
  HandleSnapShot   : THandle;
  EntryParentProc  : TProcessEntry32;
  DummyCreateFileTime : Windows.FILETIME;
  DummyExitFileTime   : Windows.FILETIME;
  DummyKernelFileTime : Windows.FILETIME;
  DummyUserFileTime   : Windows.FILETIME;
  aFileName           : String;
  h                   : THandle;
  ActualTime          : TDateTime;
  Dif                 : TDateTime;
  CreationTime        : TDateTime;


function FileTime2DateTime(FileTime: TFileTime): TDateTime;    //Convert then FileTime to TDatetime format
var
  LocalTime: TFileTime;
  DOSTime  : Integer;
begin
  FileTimeToLocalFileTime(FileTime, LocalTime);
  FileTimeToDosDateTime(LocalTime, LongRec(DOSTime).Hi, LongRec(DOSTime).Lo);
  Result := FileDateToDateTime(DOSTime);
end;

begin
  HandleSnapShot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);  //get the list of process
  if HandleSnapShot <> INVALID_HANDLE_VALUE then
  begin
    EntryParentProc.dwSize := SizeOf(EntryParentProc);
    if Process32First(HandleSnapShot, EntryParentProc) then   //Get the first process in the list
    begin
      Writeln( Format('%-30s %-20s %-16s',['FileName','Start','Running Time'])  );
      ActualTime:=Now;
      repeat
          h:=OpenProcess(PROCESS_QUERY_INFORMATION,false,EntryParentProc.th32ProcessID);  //open a particular process
          if GetProcessTimes(h, DummyCreateFileTime, DummyExitFileTime, DummyKernelFileTime, DummyUserFileTime) then  //get the timing  info
          begin
            aFileName:=ExtractFileName(EntryParentProc.szExeFile);
            CreationTime:=FileTime2DateTime(DummyCreateFileTime); //get the initial time of the process
            Dif :=  ActualTime-CreationTime; //calculate the elapsed time
            Writeln( Format('%-30s %-20s %-16s',[aFileName,FormatDateTime('DD-MM-YYYY HH:NN:SS',CreationTime),FormatDateTime('HH:NN:SS',Dif)])  );
          end;
          CloseHandle(h);
      until not Process32Next(HandleSnapShot, EntryParentProc);
    end;
    CloseHandle(HandleSnapShot);
  end;

end;



begin
  try
    GetAllProcessTime();
    Readln;
  except
    on E: Exception do
    begin
     Writeln(E.ClassName, ': ', E.Message);
     Readln;
    end;
  end;
end.
2 голосов
/ 26 ноября 2009

Существует пара или около того вызовов Windows API с «крючком» в имени, которые позволяют вам захватывать общесистемные события. Вам нужно будет встроить их в DLL, а затем сделать вызовы для «подключения» DLL из отдельного приложения.

Это, ОЧЕНЬ вкратце, правда. Надеюсь, что вы начали!

1 голос
/ 26 ноября 2009

Инструментарий управления Windows предлагает подписку на события. С WMI хорошо то, что он работает удаленно, используя DCOM и SOAP.

WMI позволяет уведомлять абонента о любом интересующем его событии.

WMI использует язык запросов WMI (WQL) отправлять запросы на события WQL и определяет тип событий, которые будут вернулся. Механизм обработки событий, с все связанные обратные вызовы, является частью WMI COM / DCOM и автоматизация интерфейсы.

Бесплатная реализация клиента WMI для Delphi доступна онлайн (не уверен, поддерживает ли она обратные вызовы событий):

Компоненты пурпурных систем WMI и SMART

1 голос
/ 26 ноября 2009

Анализатор производительности Windows имеет функции, специально предназначенные для синхронизации приложений с момента их запуска, даже если они находятся в последовательности загрузки или входа.

1 голос
/ 26 ноября 2009

хук WH_CBT , скорее всего, тот, который вы ищете. Это позволяет вам получать уведомления от ОС при каждом создании или уничтожении окна. Вы захотите использовать этот хук для захвата дескриптора и из дескриптора получите идентификатор процесса, используя GetWindowThreadProcessId . Затем вы можете передать этот дескриптор функции GetProcessTimes (предложенной RRUZ), чтобы узнать время. Пример (хотя и устаревший, концепции остаются прежними) доступен в источнике GpSysHook .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...