Comment obtenir un handle de fenêtre de console (HWND)

Cet article explique comment obtenir un handle de fenêtre de console (HWND).

S’applique à : Windows Server 2012 R2
Numéro de la base de connaissances d’origine : 124103

Résumé

Il peut être utile de manipuler une fenêtre associée à une application console. L’API Win32 ne fournit aucune méthode directe pour obtenir le handle de fenêtre associé à une application console. Toutefois, vous pouvez obtenir le handle de fenêtre en appelant FindWindow(). Cette fonction récupère un handle de fenêtre en fonction d’un nom de classe ou d’un nom de fenêtre.

Appelez GetConsoleTitle() pour déterminer le titre actuel de la console. Indiquez ensuite le titre actuel de la console à FindWindow().

Plus d’informations

Étant donné que plusieurs fenêtres peuvent avoir le même titre, vous devez remplacer le titre de la fenêtre de console actuelle par un titre unique. Ce qui permet d’empêcher le mauvais handle de fenêtre d’être retourné. Utilisez SetConsoleTitle() pour modifier le titre actuel de la fenêtre de console. Voici le processus :

  1. Appelez GetConsoleTitle() pour enregistrer le titre de la fenêtre de console actuelle.

  2. Appelez SetConsoleTitle() pour remplacer le titre de la console par un titre unique.

  3. Appelez Sleep(40) pour vérifier que le titre de la fenêtre a été mis à jour.

  4. Appelez FindWindow(NULL, uniquetitle), pour obtenir le HWND, cet appel retourne le HWND ou NULL si l’opération a échoué.

  5. Appelez SetConsoleTitle() avec la valeur récupérée à l’étape 1 pour restaurer le titre de la fenêtre d’origine.

Vous devez tester le HWND obtenu. Par exemple, vous pouvez tester pour voir si le HWND retourné correspond au processus actuel en appelant GetWindowText() sur le HWND et en comparant le résultat avec GetConsoleTitle().

Le HWND obtenu n’est pas garanti qu’il convient à toutes les opérations de handle de fenêtre.

Exemple de code

La fonction suivante récupère le handle de fenêtre d’application de console actuel (HWND). Si la fonction réussit, la valeur de retour est le handle de la fenêtre de console. Si la fonction échoue, la valeur de retour est NULL. Certaines vérifications des erreurs sont omises, par souci de concision.

HWND GetConsoleHwnd(void)
   {
       #define MY_BUFSIZE 1024 // Buffer size for console window titles.
       HWND hwndFound;         // This is what is returned to the caller.
       char pszNewWindowTitle[MY_BUFSIZE]; // Contains fabricated
                                           // WindowTitle.
       char pszOldWindowTitle[MY_BUFSIZE]; // Contains original
                                           // WindowTitle.

       // Fetch current window title.

       GetConsoleTitle(pszOldWindowTitle, MY_BUFSIZE);

       // Format a "unique" NewWindowTitle.

       wsprintf(pszNewWindowTitle,"%d/%d",
                   GetTickCount(),
                   GetCurrentProcessId());

       // Change current window title.

       SetConsoleTitle(pszNewWindowTitle);

       // Ensure window title has been updated.

       Sleep(40);

       // Look for NewWindowTitle.

       hwndFound=FindWindow(NULL, pszNewWindowTitle);

       // Restore original window title.

       SetConsoleTitle(pszOldWindowTitle);

       return(hwndFound);
   }