Obtención de un identificador de ventana de consola (HWND)

En este artículo se describe cómo obtener un identificador de ventana de consola (HWND).

Se aplica a: Windows Server 2012 R2
Número de KB original: 124103

Resumen

Puede ser útil manipular una ventana asociada a una aplicación de consola. La API win32 no proporciona ningún método directo para obtener el identificador de ventana asociado a una aplicación de consola. Sin embargo, puede obtener el identificador de ventana llamando a FindWindow(). Esta función recupera un identificador de ventana basado en un nombre de clase o nombre de ventana.

Llame GetConsoleTitle() a para determinar el título de la consola actual. A continuación, proporcione el título de la consola actual a FindWindow().

Más información

Dado que varias ventanas pueden tener el mismo título, debe cambiar el título de la ventana de consola actual a un título único. Lo que ayudará a evitar que se devuelva el identificador de ventana incorrecto. Use SetConsoleTitle() para cambiar el título de la ventana de consola actual. Este es el proceso:

  1. Llame GetConsoleTitle() a para guardar el título de la ventana de consola actual.

  2. Llame SetConsoleTitle() a para cambiar el título de la consola a un título único.

  3. Llame a Sleep(40) para asegurarse de que se actualizó el título de la ventana.

  4. Llame a FindWindow(NULL, uniquetitle) para obtener el HWND que esta llamada devuelve HWND o NULL si se produjo un error en la operación.

  5. Llame a SetConsoleTitle() con el valor recuperado del paso 1 para restaurar el título de la ventana original.

Debe probar el HWND resultante. Por ejemplo, puede probar para ver si el HWND devuelto se corresponde con el proceso actual llamando a GetWindowText() en hwnd y comparando el resultado con GetConsoleTitle().

No se garantiza que el HWND resultante sea adecuado para todas las operaciones de control de ventana.

Código de ejemplo

La siguiente función recupera el identificador de ventana de la aplicación de consola actual (HWND). Si la función se realiza correctamente, el valor devuelto es el identificador de la ventana de consola. Si se produce un error en la función, el valor devuelto es NULL. Se omite alguna comprobación de errores, por brevedad.

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