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 :

Comment savoir quelle application a le focus


Sujet :

Windows

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 7
    Points : 2
    Points
    2
    Par défaut Comment savoir quelle application a le focus
    Salut

    Donc tout est dans le titre.
    Je recherche une fonction ou un moyen de savoir quelle prcessus a le focus de preference en api,en c ou c++ sa n'a pas d'importance et ca n'a pas besoin d'être portable.
    Je programme sous windows xp avec Code:Blocks.
    merci d'avance.
    Bonne journée.

  2. #2
    Membre éclairé Avatar de stephl
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 643
    Points : 771
    Points
    771
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    GetFocus() ou GetForegroundWindow()
    me semble-t-il.

    EDIT: Plus précisément:
    Citation Envoyé par Win32 Developer's References
    The GetFocus function retrieves the handle of the window that has the keyboard focus, if the window is associated with the calling thread's message queue.

    HWND GetFocus(VOID)


    Parameters

    This function has no parameters.

    Return Values

    If the function succeeds, the return value is the handle of the window with the keyboard focus. If the calling thread's message queue does not have an associated window with the keyboard focus, the return value is NULL.

    Remarks

    Even if GetFocus returns NULL, another thread's queue may be associated with a window that has the keyboard focus.
    Use the GetForegroundWindow function to retrieve the handle to the window with which the user is currently working. You can associate your thread's message queue with the windows owned by another thread by using the AttachThreadInput function.

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 7
    Points : 2
    Points
    2
    Par défaut recuperer le nom d'une application d'après son handle
    re

    C'est encore moi,je n'ai pas reussi a faire marcher GetFocus alors j'ai utilisé GetForegroundWindow().J'ai le handle mais je ne sais pas comment retrouver le nom de l'application associé à cet handle.
    (je suis un petit new en api)
    merci d'avance.

  4. #4
    Membre éclairé Avatar de stephl
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 643
    Points : 771
    Points
    771
    Par défaut
    Il y a peut-être plus simple mais cela devrait fonctionner:
    1. GetForegroundWindow() pour obtenir le handle de fenêtre
    2. GetWindowThreadProcessId() pour obtenir l'id du process ayant créé cette fenêtre
    3. CreateToolhelp32Snapshot() pour obtenir un aperçu des process
    4. Process32First() et Process32Next() pour parcourir la liste des process jusqu'à obtenir celui ayant l'id recherché
    5. Le nom de l'EXE est dans le champ szExeFile de la structure PROCESSENTRY32

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    merci pour ta reponce. c'est nikel c'est se que je cherchais.
    je vais essayer sa tout de suite et je tiens au courant.
    merci encore

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    salut

    je galere,je ne sais plus comment faire
    j'ai reussi a récuperer le handle de la fenêtre grace a GetForegroundWindow()
    puis d'après le handle j'ai reussi a trouver un PID mais celui si n'est pas dans le gestionaire des tache donc je suppose que c'est le PID d'un thread ou un truc comme sa.(oublié pas je suis un petit nouveau en api)
    j'ai essayé d'utiliser Process32First() mais je dois m'être planter dans les arguments à envoyer car j'ai des warnings à la compilation.
    voici un bout de code "test" que j'ai fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    #include <windows.h>
    #include <tlhelp32.h>
    #include <stdio.h>
    
    
    
    
    
    int main( )
    {
        HANDLE hProcessSnap;
        LPPROCESSENTRY32 lppe;
    
    
         
            HWND PID=GetForegroundWindow();
    
            HANDLE hSnapShot=CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, PID);//j'ai un warning au niveau du deuxieme argument
            BOOL WINAPI Process32First(
                hSnapshot,
                lppe//j'ai un autre warning ici 
            );
            printf("%s\n", lppe->szExeFile);
            system("pause");
    
    return 0;
    }
    merci encore pour votre aide mais la je suis sur le point d'abandonner cette idée
    help!!!!!!!!!!!!!!!
    a++

  7. #7
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Il te manque l'appel à GetWindowThreadProcessId() pour passer d'un HWND à un ID de processus...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  8. #8
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    re
    merci pour ta reponce.
    Alors j'ai arrangé un peu le code, donc je n'ai plus de warning à la compilation
    mais à la sortie de mon printf j'obtiens des caracteres bizar
    d'où cela peut il venir??
    voici le nouveau code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    #include <windows.h>
    #include <tlhelp32.h>
    #include <stdio.h>
    
    //  Forward declarations:
    
    
    
    int main( )
    {
        HANDLE hProcessSnap;
    
        LPPROCESSENTRY32 lppe;
    
           
            // Take a snapshot of all processes in the system.
            HWND handle=GetForegroundWindow();
    DWORD PID=GetWindowThreadProcessId(handle,0);
            HANDLE hSnapShot=CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, PID);
            Process32First(&PID,lppe);
            printf("%s\n", lppe->szExeFile);
           
            
    
    
    
    }
    merci encore
    a++

  9. #9
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Process32First(&PID,lppe);
    Cette ligne me parait bizarre.
    Es-tu sûr qu'il ne faut pas mettre hSnapshot au lieu de &PID ?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  10. #10
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    je viens d'essayer, et le resultat est le même
    j'ai des caractères tout bizar.
    je desespere

  11. #11
    Membre éclairé Avatar de stephl
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 643
    Points : 771
    Points
    771
    Par défaut
    J'ai écrit cela rapidement, et cela semble fonctionner.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    #include <windows.h>
    #include <tlhelp32.h>
    #include <stdio.h>
    
    int main(void)
     {
     HWND hwnd;
     DWORD processid;
     HANDLE snapshot;
     PROCESSENTRY32 processinfo;
     int ok;
     
     printf("Vous avez 10s pour changer de fenetre\n");
     Sleep(10000);
     hwnd=GetForegroundWindow();
     GetWindowThreadProcessId(hwnd,&processid);
     printf("process id=%u\n",processid);
     if ((snapshot=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0))==(HANDLE) -1)
      printf("Erreur: echec de la creation du snapshot\n");
     else
      {
      ok=0;
      processinfo.dwSize=sizeof processinfo;
      if (Process32First(snapshot,&processinfo))
       do
        if (processinfo.th32ProcessID==processid)
         {
         printf("%s\n",processinfo.szExeFile);
         ok=1;
         break;
         }
       while (Process32Next(snapshot,&processinfo));
      CloseHandle(snapshot);
      if (!ok) printf("Erreur: process non trouve\n");
      }
     return 0;
     }

  12. #12
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    salut


    merci pour le code, sa marche au poil
    a++

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Comment savoir quelle application utilise quel bloc d'instructions
    Par ramzioil dans le forum x86 32-bits / 64-bits
    Réponses: 10
    Dernier message: 20/04/2009, 15h16
  2. [Process] Comment savoir quelle application est ouverte ?
    Par samus535 dans le forum Framework .NET
    Réponses: 1
    Dernier message: 25/08/2006, 15h01
  3. DLL -> savoir quelle application ou form l'a appelée
    Par chtiot dans le forum API, COM et SDKs
    Réponses: 4
    Dernier message: 25/02/2006, 11h33
  4. Comment savoir quelle fenêtre possède le focus ?
    Par WebPac dans le forum API, COM et SDKs
    Réponses: 4
    Dernier message: 22/12/2005, 09h59
  5. Comment savoir quelle version d'MSXML IE utilise?
    Par trent94 dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 17/07/2005, 18h38

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