Como obter um HWND (Identificador de Janela do Console)

Este artigo descreve como obter um HWND (Console Window Handle).

Aplica-se a: Windows Server 2012 R2
Número de KB original: 124103

Resumo

Pode ser útil manipular uma janela associada a um aplicativo de console. A API win32 não fornece nenhum método direto para obter o identificador de janela associado a um aplicativo de console. No entanto, você pode obter o identificador de janela chamando FindWindow(). Essa função recupera um identificador de janela com base em um nome de classe ou nome da janela.

Chame GetConsoleTitle() para determinar o título atual do console. Em seguida, forneça o título do console atual para FindWindow().

Mais informações

Como várias janelas podem ter o mesmo título, você deve alterar o título da janela do console atual para um título exclusivo. O que ajudará a impedir que o identificador de janela errado seja retornado. Use SetConsoleTitle() para alterar o título da janela do console atual. Aqui está o processo:

  1. Chame GetConsoleTitle() para salvar o título da janela do console atual.

  2. Chame SetConsoleTitle() para alterar o título do console para um título exclusivo.

  3. Chame Sleep(40) para garantir que o título da janela seja atualizado.

  4. Chamar FindWindow(NULL, uniquetitle), para obter o HWND, essa chamada retornará o HWND ou NULL se a operação falhar.

  5. Chame SetConsoleTitle() com o valor recuperado da etapa 1 para restaurar o título da janela original.

Você deve testar o HWND resultante. Por exemplo, você pode testar para ver se o HWND retornado corresponde ao processo atual chamando GetWindowText() o HWND e comparando o resultado com GetConsoleTitle().

O HWND resultante não tem garantia de ser adequado para todas as operações de identificador de janela.

Código de exemplo

A função a seguir recupera o HWND (identificador de janela do aplicativo de console) atual. Se a função for bem-sucedida, o valor retornado será o identificador da janela do console. Se a função falhar, o valor retornado será NULL. Alguma verificação de erro é omitida, para brevidade.

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