2009-11-25 4 views

Répondre

2

Il existe un ou plusieurs appels API Windows avec 'hook' dans le nom qui vous permettent de capturer des événements à l'échelle du système. Vous devrez les construire dans une DLL, puis faire des appels à la DLL «hooking» à partir d'une application distincte.

Voilà, TRÈS brièvement, c'est ça. J'espère que vous avez commencé!

3

Vous pouvez utiliser la fonction GetProcessTimes pour obtenir des informations de cadencement pour un processus particulier.

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

Voir cet exemple

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. 
1

le WH_CBT hook est très probablement celui que vous recherchez. Il vous permet d'être averti par le système d'exploitation chaque fois qu'une fenêtre est créée ou détruite. Vous voudrez utiliser ce crochet pour attraper la poignée et à partir de la poignée obtenir l'ID du processus en utilisant GetWindowThreadProcessId. Vous pouvez ensuite passer ce handle à la fonction GetProcessTimes (proposée par RRUZ) pour obtenir les heures. Un exemple (bien que daté, les concepts sont toujours les mêmes) est disponible dans la source GpSysHook.

1

Windows Performance Analyzer a des fonctionnalités spécifiques pour les applications de chronométrage à partir du moment où elles commencent, même si elles sont dans la séquence de démarrage ou de connexion. Windows Management Instrumentation offre un abonnement d'événement.

1

Ce qui est bien avec WMI, c'est qu'il fonctionne également à distance, en utilisant DCOM et SOAP.

WMI offers the capability to notify a subscriber for any event it is interested in.

WMI utilise le langage de requête WMI (WQL) pour soumettre des requêtes d'événements WQL et définit le type d'événements à retournés. Le mécanisme d'événement, avec tous les rappels connexes, fait partie des interfaces WMI COM/DCOM et d'automatisation .

Une implémentation client gratuit WMI pour Delphi est disponible en ligne (pas sûr si elle prend en charge les rappels d'événements):

Magenta Systems WMI and SMART Component

Questions connexes