Comment attraper le début et l'achèvement des applications (processus) dans Win. Comment mesurer l'heure de chaque application?Attraper les applications de démarrage
Répondre
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é!
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.
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.
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.
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):
- 1. IIS: démarrage des applications Web
- 2. Applications ASP.NET à démarrage automatique
- 3. Démarrage d'autres applications avec Java
- 4. Démarrage très lent des applications ASP.NET
- 5. Essayez Attraper - pas attraper
- 6. XSLT - Attraper les paramètres
- 7. Attraper les exceptions polymorphically
- 8. Attraper les erreurs http
- 9. Attraper les intentions de recherche de marché?
- 10. Attraper les onglets dans TextArea
- 11. Attraper toutes les exceptions Wordpress?
- 12. attraper les chemins de fichier non valides
- 13. Attraper les codes de retour dans les environnements de production?
- 14. Obtenir tous les éléments de démarrage?
- 15. Les applications des applications Google se parlent
- 16. Démarrage de delayed_job au démarrage avec des rails
- 17. Attraper les liens UIWebView modaux touche
- 18. Attraper toutes les exceptions dans C#
- 19. Comment attraper toutes les exceptions d'un WebService?
- 20. Attraper les détails d'WebFaultException dans WCF Rest
- 21. Windows 7 attraper sommeil/suspendre les messages
- 22. Attraper les exceptions dans un thread .NET
- 23. Autorelease pools dans les applications appkit
- 24. Communiquer entre les applications C++ et les applications Web
- 25. ASP.NET attraper l'action de soumission
- 26. Le contexte d'application de Spring empêche le démarrage d'autres applications dans le même conteneur de servlets
- 27. Renforcer les threads au démarrage
- 28. activité de démarrage du service à distance de différentes applications (APK)
- 29. Internationaliser les applications .NET
- 30. Catégoriser les applications