Получение дескриптора окна консоли (HWND)

В этой статье описывается, как получить дескриптор окна консоли (HWND).

Применяется к: Windows Server 2012 R2
Исходный номер базы знаний: 124103

Сводка

Может быть полезно управлять окном, связанным с консольным приложением. API Win32 не предоставляет прямого метода для получения дескриптора окна, связанного с консольным приложением. Однако дескриптор окна можно получить, вызвав .FindWindow() Эта функция извлекает дескриптор окна на основе имени класса или имени окна.

Вызовите GetConsoleTitle() , чтобы определить название текущей консоли. Затем укажите заголовок текущей консоли в FindWindow().

Дополнительная информация

Так как несколько окон могут иметь одинаковые названия, следует изменить заголовок текущего окна консоли на уникальный. Это поможет предотвратить возврат неправильного дескриптора окна. Используйте SetConsoleTitle() для изменения заголовка текущего окна консоли. Ниже приведен процесс.

  1. Вызовите, GetConsoleTitle() чтобы сохранить заголовок текущего окна консоли.

  2. Вызовите SetConsoleTitle() , чтобы изменить заголовок консоли на уникальный.

  3. Вызов спящего режима (40), чтобы убедиться, что заголовок окна обновлен.

  4. Вызовите FindWindow(NULL, uniquetitle), чтобы получить HWND, этот вызов возвращает HWND- или NULL в случае сбоя операции.

  5. Вызовите SetConsoleTitle() со значением, полученным на шаге 1, для восстановления исходного заголовка окна.

Необходимо протестировать результирующий HWND. Например, можно проверить, соответствует ли возвращенный HWND текущему процессу, вызвав GetWindowText() в HWND и сравнив результат с GetConsoleTitle().

Полученный HWND не гарантирует, что подходит для всех операций дескриптора окна.

Пример кода

Следующая функция извлекает текущий дескриптор окна консольного приложения (HWND). Если функция выполнена успешно, возвращаемое значение является дескриптором окна консоли. Если функция завершается сбоем, возвращаемое значение равно NULL. Некоторые проверки ошибок опущены для краткости.

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