Distinguer des fenêtres qui ont le même handle

Résolu
Lustuc Messages postés 30 Date d'inscription lundi 18 août 2008 Statut Membre Dernière intervention 20 octobre 2009 - 20 août 2008 à 22:25
Lustuc Messages postés 30 Date d'inscription lundi 18 août 2008 Statut Membre Dernière intervention 20 octobre 2009 - 22 août 2008 à 12:29
Bonjour,

Ma question est sans doute un peu bête, mais je nage un peu avec les handle.

J'ai une application qui ouvre plusieurs fenêtres, je voudrais pouvoir avoir le handle spécifique de l'une d'entre elle, or elles ont toute le même...

J'ai cru comprendre qui y a la notion de parent au niveau des handle. En gros je cherche à voir celui d'un des enfants

Si il y avait une bonne âme pour me montrer la lumière dans ce monde obscure des handle ça serait bien sympa...

7 réponses

Lustuc Messages postés 30 Date d'inscription lundi 18 août 2008 Statut Membre Dernière intervention 20 octobre 2009
22 août 2008 à 12:29
ça a marché ! ! ! avec EnumWindows.

Voici le code qui m'a permi d'afficher tous les handle avec les titres des fenêtres.
Les fenêtres qui apparaissaient avec le même handle avec la fonction FindWindow, ont ici des handle bien distincts:
La fonction :<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" /??>

 

BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)

{

    char caption[255];

    HWND hwndTable;

     if(IsWindowVisible(hwnd))

     {

        printf("handle %X\n", hwnd);

        GetWindowText(hwnd,caption,255);

        printf("titre : %s\n\n", caption);

    }

    return TRUE;

}

 

 

Appel à la fonction:

 

EnumWindows(EnumWindowsProc, 0);

Merci pour votre aide,

A+ Lustuc
3
cs_juju12 Messages postés 966 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 4 mars 2010 4
21 août 2008 à 00:43
plusieurs fenêtres ne peuvent pas avoir le même hwnd, à moins que ton application dessine elle-même les fenêtres sur un fond commun, mais dans ce cas on n'est plus vraiment dans le contexte des fenêtres de l'API. Est-ce le cas?
Sinon comment récupères-tu tes handle? Je veux dire, quel code emploies-tu (avec quels résultats) pour pouvoir dire que les fenêtres ont le même hwnd?
Les fonctions utiles pour trouver les fenêtres enfants sont par exemple EnumChildWindows(), ou FindWindowEx()...
0
Lustuc Messages postés 30 Date d'inscription lundi 18 août 2008 Statut Membre Dernière intervention 20 octobre 2009
21 août 2008 à 01:40
Le code est le suivant :

    char caption[255];

    Sleep(5000);         // j'ai 5 seconde pour passer la première fenêtre en active

    GetWindowText(GetForegroundWindow(),caption,255);
    printf("le titre est: %s\n", caption);



    HANDLE HWND1 = FindWindow(NULL,caption);
    printf("le handle de la fenetre 1 est : %X\n\n", HWND1);



    Sleep(5000);         // j'ai 5 seconde pour passer la deuxième fenêtre en active

    GetWindowText(GetForegroundWindow(),caption,255);
    printf("le titre est: %s\n", caption);




    HANDLE HWND2 = FindWindow(NULL,caption);
    printf("le handle de la fenetre 2 est : %X\n\n", HWND2);





En résultat, il m'affiche le titre de la 1ère fenêtre avec "1008A" pour Handle

puis le titre de la seconde fenêtre avec toujours "1008A" pour Handle

L'appli génère des fenêtres, mais ces dernières ne sont pas identiques et n'ont pas la même fonction, notamment la fenêtre parent et les fenêtres enfants.
0
fregolo52 Messages postés 1114 Date d'inscription mercredi 15 juin 2011 Statut Membre Dernière intervention 6 mai 2021 4
21 août 2008 à 09:20
Si tu maitrises tout, c'est a dire que tu accès au code source des fenetres que tu ouvres, tu devrais passer en mode debug et regarder à qui appartient ce handle.
Si pour chaque fenetre tu as fait un CreateWindow, elles devraient toutes avoir des handles différents.

Sinon as-tu testé le retour de GetForegroundWindow() ? Pour voir si c'est les mêmes que la fonction FindWindow.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Lustuc Messages postés 30 Date d'inscription lundi 18 août 2008 Statut Membre Dernière intervention 20 octobre 2009
21 août 2008 à 11:24
Il s'agit d'applications externes dont je n'ai pas accès au code.
Je début en C, comment fais-tu pour tester le code retour?
0
fregolo52 Messages postés 1114 Date d'inscription mercredi 15 juin 2011 Statut Membre Dernière intervention 6 mai 2021 4
21 août 2008 à 13:17
GetForegroundWindow() tu retournes le handle (hwnd) de la fenetre active de Windows (je crois).
J'aime pas trop FindWindow.



Essaie EnumWindows.



Voici mon code avec EmunChildWindows (que tu adapteras pour EnumWindows et tes besoins) qui change les libelles des controles de la fenetre dans la langue désirée :

static BOOL CALLBACK EnumControlsForLanguage(
  HWND hwnd,      // handle to child window
  LPARAM lParam   // application-defined value
)
{
 CString cs;
 int id = GetDlgCtrlID(hwnd);
 cs.LoadString(id);
 SetWindowText(hwnd, cs);

 return TRUE;
}

 EnumChildWindows(this->m_hWnd, EnumControlsForLanguage, NULL);
0
Lustuc Messages postés 30 Date d'inscription lundi 18 août 2008 Statut Membre Dernière intervention 20 octobre 2009
21 août 2008 à 13:59
OK merci je vais essayer ce soir...
0
Rejoignez-nous