Come ottenere un handle di finestra della console (HWND)

Questo articolo descrive come ottenere un handle di finestra della console (HWND).

Si applica a: Windows Server 2012 R2
Numero KB originale: 124103

Riepilogo

Può essere utile modificare una finestra associata a un'applicazione console. L'API Win32 non fornisce alcun metodo diretto per ottenere l'handle di finestra associato a un'applicazione console. È tuttavia possibile ottenere l'handle della finestra chiamando FindWindow(). Questa funzione recupera un handle di finestra in base al nome di una classe o di una finestra.

Chiamare GetConsoleTitle() per determinare il titolo della console corrente. Specificare quindi il titolo della console corrente a FindWindow().

Ulteriori informazioni

Poiché più finestre possono avere lo stesso titolo, è necessario modificare il titolo della finestra della console corrente in un titolo univoco. Ciò consentirà di evitare che venga restituito l'handle di finestra errato. Usare SetConsoleTitle() per modificare il titolo della finestra della console corrente. Ecco il processo:

  1. Chiamare GetConsoleTitle() per salvare il titolo della finestra della console corrente.

  2. Chiamare SetConsoleTitle() per modificare il titolo della console in un titolo univoco.

  3. Chiamare Sleep(40) per assicurarsi che il titolo della finestra sia stato aggiornato.

  4. Chiamata FindWindow(NULL, uniquetitle) per ottenere l'HWND che questa chiamata restituisce HWND o NULL se l'operazione non è riuscita.

  5. Chiamare SetConsoleTitle() con il valore recuperato dal passaggio 1 per ripristinare il titolo della finestra originale.

È consigliabile testare l'HWND risultante. Ad esempio, è possibile verificare se l'HWND restituito corrisponde al processo corrente chiamando GetWindowText() su HWND e confrontando il risultato con GetConsoleTitle().

L'HWND risultante non è sicuramente adatto a tutte le operazioni di handle della finestra.

Codice di esempio

La funzione seguente recupera l'handle della finestra dell'applicazione console corrente (HWND). Se la funzione ha esito positivo, il valore restituito è l'handle della finestra della console. Se la funzione ha esito negativo, il valore restituito è NULL. Per brevità, viene omesso un controllo degli errori.

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);
   }