IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Discussion :

[Win32/C] estimer la durée d'utilisation de mes applications sur ma machine


Sujet :

Windows

  1. #1
    Membre éprouvé

    Profil pro
    Inscrit en
    Août 2003
    Messages
    878
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 878
    Points : 1 067
    Points
    1 067
    Par défaut [Win32/C] estimer la durée d'utilisation de mes applications sur ma machine
    Bonjour,

    Une idée de projet m'a traversé l'esprit : écrire un programme qui me donne une estimation (i.e. : pas besoin de résultats parfaits à la microseconde près) de la durée d'utilisation des applications que j'utilise.
    Pour vous donner un exemple, je souhaite que mon programme me dise (ou m'écrive ) un truc du genre : "Aujourd'hui, tu as utilisé Firefox pendant 3 heures, Dev-C++ pendant 8 heures et notepad pendant 2 minutes".
    Ok ?

    J'en suis au stade où j'essaye de trouver des méthodes pour arriver à mes fins et pour l'instant j'ai pensé à deux possibilités :
    • régulièrement appeler GetForegroundWindow(), utiliser le handle pour obtenir le PID du processus lié et énumérer les modules à partir du PID pour avoir le chemin de l'exécutable ;
    • créer un hook avec SetWindwosHookEx(), récupérer le handle de la fenêtre concernée lorsqu'un message WM_SETFOCUS est récupéré, utiliser le handle pour récupérer le PID puis le chemin vers l'exécutable.

    Dans les deux cas, je peux créer une liste de la forme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    dateHeure01 applicationX
    dateHeure02 applicationY
    dateHeure03 applicationX
    dateHeure04 applicationZ
    dateHeure05 applicationY
    ...
    Pour avoir, par exemple, la durée d'utilisation de l'application X je n'aurai qu'à calculer : ( dateHeure02 - dateHeure01) + ( dateHeure04 - dateHeure03 ).
    Vous suivez toujours ?

    La seconde méthode me semble plus "propre".
    Première question : qu'en pensez-vous ?
    Deuxième question : verriez-vous une autre façon de faire ?

    Maintenant, j'ai un autre problème : il m'arrive d'utiliser des applications en ligne de commande. Or, avec les deux méthodes décrites ci-dessus, j'obtiendrai probablement un résultat du type "Aujourd'hui, tu as utilisé cmd.exe pendant 20 minutes" si je lance ces applications à partir de cmd.exe (puisque c'est lui qui aura créé une fenêtre). Ce qui m'amène à ma...
    Troisième question : comment faire dans ce cas ?

    Enfin, j'aimerai aussi que mon programme soit averti aux moments où je verrouillerai ma session pour aller boire un café au bar du coin et où je la déverrouillerai quand je serai revenu.
    Quatrième question : est-il, à votre connaissance, possible d'être averti de ces événements, sans avoir à lire le journal des événements ?

    Merci d'avance
    Un problème bien exposé
    est, pour moitié, solutionné. / La connaissance s'accroît quand on la partage, pas quand on l'impose. / La violence est le langage des faibles.

  2. #2
    Membre confirmé Avatar de Mayti4
    Inscrit en
    Février 2004
    Messages
    442
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 442
    Points : 488
    Points
    488
    Par défaut
    j'ai un autre problème : il m'arrive d'utiliser des applications en ligne de commande. Or, avec les deux méthodes décrites ci-dessus, j'obtiendrai probablement un résultat du type "Aujourd'hui, tu as utilisé cmd.exe pendant 20 minutes" si je lance ces applications à partir de cmd.exe (puisque c'est lui qui aura créé une fenêtre). Ce qui m'amène à ma...
    Troisième question : comment faire dans ce cas ?
    Ne pas se baser sur les fenêtres, sachant qu'un processus peut ne pas en avoir.

    Tu peux énumérer les processus en cours avec Process32First .

    Pour le temps d'exécution, la fonction GetProcessTimes permet d'avoir le temps de création d'un processus.
    L'itération est humaine; la récursion, divine.

  3. #3
    Membre éprouvé

    Profil pro
    Inscrit en
    Août 2003
    Messages
    878
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 878
    Points : 1 067
    Points
    1 067
    Par défaut
    Citation Envoyé par Mayti4
    Ne pas se baser sur les fenêtres, sachant qu'un processus peut ne pas en avoir.

    Tu peux énumérer les processus en cours avec Process32First .

    Pour le temps d'exécution, la fonction GetProcessTimes permet d'avoir le temps de création d'un processus.
    Désolé, j'ai du mal m'exprimer.
    Je vais essayer de donner un exemple qui sera peut-être plus parlant.
    Avant, il faut noter que le sujet de mon message initial est : "estimer la durée d'utilisation de mes applications sur ma machine".
    Ce n'est pas : "estimer la durée d'exécution de mes processus sur ma machine".

    Autrement dit, je pars du principe que :
    - je suis sous Windows et que sous Windows on a une interface graphique et qu'on utilise cette dernière pour "manipuler"/"dialoguer avec"/"utiliser" les applications ;
    - par "utiliser", j'entends "interagir avec" (donc, les services et tout ce qui peut tourner en tâche de fond, je ne m'en occupe pas) ;
    - je vaux savoir à quoi j'occupe mon temps sous Windows, pas à quoi le processeur occupe son temps.

    Un exemple, que j'espère plus parlant :
    • j'allume ma machine ;
    • j'ouvre une session ;
    • je lance OpenOffice.org/Writer (abrégé OOo par la suite) et Firefox (abrégé FF par la suite ; on considérera, pour l'exemple qu'ils sont lancés en même temps) ;
    • je saisis du texte dans OOo pendant 20 minutes ;
    • je bascule sur FF et "surfe" pendant 20 minutes ;
    • je bascule sur OOo et tape du texte pendant 10 minutes ;
    • je bascule sur FF et "surfe" pendant 10 minutes ;
    • je ferme ma session (ce qui a pour effet de fermer OOo et FF).
    Là, je veux que mon programme ait enregistré :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    OOo => 30 minutes
    FF => 30 minutes
    Alors qu'avec GetProcessTimes() j'aurai plutôt un résultat du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    OOo => 60 minutes
    FF => 60 minutes
    C'est pour cette raison que je pense que je dois me baser sur les fenêtres, car, d'une certaine façon, c'est par elles que passe l'interaction entre moi et telle ou telle application.

    On peut mettre les programmes en ligne de commande de côté pour l'instant si ça vous permet de mieux comprendre. Au pire je pourrai toujours vérifier si cmd.exe a un processus fils ou pas et si oui le prendre en compte plutôt que cmd.exe.

    Est-ce plus clair comme ça ?
    Un problème bien exposé
    est, pour moitié, solutionné. / La connaissance s'accroît quand on la partage, pas quand on l'impose. / La violence est le langage des faibles.

  4. #4
    Membre confirmé Avatar de Mayti4
    Inscrit en
    Février 2004
    Messages
    442
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 442
    Points : 488
    Points
    488
    Par défaut
    Est-ce plus clair comme ça ?
    Oui.

    Je pense aussi que le hook soit une bonne solution, mais en hookant le message WM_ACTIVATEAPP.

    Pour les consoles, à part le titre qui contient la commande effectuée

    (si le programme lancé ne le change pas..), je ne vois pas.
    L'itération est humaine; la récursion, divine.

  5. #5
    Membre éprouvé

    Profil pro
    Inscrit en
    Août 2003
    Messages
    878
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 878
    Points : 1 067
    Points
    1 067
    Par défaut
    Citation Envoyé par Mayti4
    Oui.

    Je pense aussi que le hook soit une bonne solution, mais en hookant le message WM_ACTIVATEAPP.
    Merci.

    Citation Envoyé par Mayti4
    Pour les consoles, à part le titre qui contient la commande effectuée

    (si le programme lancé ne le change pas..), je ne vois pas.
    Comme dit dans mon précédent message : si la fenêtre appartient à une instance de cmd.exe, on peut parcourir les processus et voir si il y en a un qui a l'instance en question comme parent. Si c'est le cas, on enregistre cette application plutôt que cmd.exe. Cela ne résoud que partiellement le problème puisqu'on est pas notifié du lancement d'une application par cmd.exe et qu'on ne détectera l'application en question que lors d'une activation de la fenêtre de cmd.exe, mais ce n'est pas "critique" (sinon, il y a toujours la possibilité d'intercepter les appels à CreateProcess() faits par cmd.exe, mais bon...).
    Un problème bien exposé
    est, pour moitié, solutionné. / La connaissance s'accroît quand on la partage, pas quand on l'impose. / La violence est le langage des faibles.

  6. #6
    Membre éprouvé

    Profil pro
    Inscrit en
    Août 2003
    Messages
    878
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 878
    Points : 1 067
    Points
    1 067
    Par défaut
    'soir,

    Et pour la détection/notification du verrouillage de la session ?
    Quelqu'un aurait-il une idée à proposer ?

    Merci
    Un problème bien exposé
    est, pour moitié, solutionné. / La connaissance s'accroît quand on la partage, pas quand on l'impose. / La violence est le langage des faibles.

  7. #7
    Membre actif
    Profil pro
    Inscrit en
    Février 2006
    Messages
    413
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2006
    Messages : 413
    Points : 286
    Points
    286
    Par défaut
    Intercepter les messages WM_QUERYENDSESSION ou WM_ENDSESSION peut-être...

  8. #8
    Membre éprouvé

    Profil pro
    Inscrit en
    Août 2003
    Messages
    878
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 878
    Points : 1 067
    Points
    1 067
    Par défaut
    Citation Envoyé par NicolasJolet
    Intercepter les messages WM_QUERYENDSESSION ou WM_ENDSESSION peut-être...
    J'avais raté ces deux là. Merci, je vais voir.
    J'y crois assez moyennement vu la doc. [1] mais qui ne tente rien (et puis ça me donne une piste)...

    Merci

    [1] - le but étant d'être notifié d'un verrouillage, pas d'une déconnexion
    Un problème bien exposé
    est, pour moitié, solutionné. / La connaissance s'accroît quand on la partage, pas quand on l'impose. / La violence est le langage des faibles.

  9. #9
    Membre actif
    Profil pro
    Inscrit en
    Février 2006
    Messages
    413
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2006
    Messages : 413
    Points : 286
    Points
    286
    Par défaut
    Effectivement j'avais mal lu la question, celà concerne uniquement le log off

  10. #10
    Membre actif
    Profil pro
    Inscrit en
    Février 2006
    Messages
    413
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2006
    Messages : 413
    Points : 286
    Points
    286
    Par défaut
    Je pense avoir trouvé ce que tu cherchais :
    ICI
    Sous la section Windows Session Switching

  11. #11
    Membre éprouvé

    Profil pro
    Inscrit en
    Août 2003
    Messages
    878
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 878
    Points : 1 067
    Points
    1 067
    Par défaut
    Merci

    Ce n'est valable qu'à partir de Win XP mais je m'en contenterai pour l'instant.

    Sinon, pour info., j'avais pensé à comparer le Desktop courant avec celui auquel l'application est attachée (en considérant qu'elle est lancée dans le "Desktop" "Default") : si ils diffèrent, c'est que la session est verrouillée (ou qu'un économiseur d'écran écrit proprement est en train de fonctionner).
    Un problème bien exposé
    est, pour moitié, solutionné. / La connaissance s'accroît quand on la partage, pas quand on l'impose. / La violence est le langage des faibles.

Discussions similaires

  1. Réponses: 1
    Dernier message: 29/02/2008, 14h18
  2. Réponses: 3
    Dernier message: 26/02/2007, 11h31
  3. Réponses: 13
    Dernier message: 03/01/2007, 12h17
  4. Réponses: 7
    Dernier message: 12/07/2006, 10h24
  5. Réponses: 2
    Dernier message: 20/06/2005, 11h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo