Jak uzyskać uchwyt okna konsoli (HWND)

W tym artykule opisano sposób uzyskiwania uchwytu okna konsoli (HWND).

Dotyczy: Windows Server 2012 R2
Oryginalny numer KB: 124103

Podsumowanie

Może być przydatne manipulowanie oknem skojarzonym z aplikacją konsolową. Interfejs API Win32 nie zapewnia bezpośredniej metody uzyskiwania uchwytu okna skojarzonego z aplikacją konsolową. Można jednak uzyskać dojście okna, wywołując polecenie FindWindow(). Ta funkcja pobiera dojście okna na podstawie nazwy klasy lub nazwy okna.

Wywołaj polecenie GetConsoleTitle() , aby określić bieżący tytuł konsoli. Następnie podaj bieżący tytuł konsoli do FindWindow().

Więcej informacji

Ponieważ wiele okien może mieć ten sam tytuł, należy zmienić bieżący tytuł okna konsoli na unikatowy tytuł. Dzięki temu nie będzie zwracany niewłaściwy uchwyt okna. Użyj polecenia SetConsoleTitle() , aby zmienić bieżący tytuł okna konsoli. Oto proces:

  1. Wywołaj polecenie GetConsoleTitle() , aby zapisać bieżący tytuł okna konsoli.

  2. Wywołaj polecenie SetConsoleTitle() , aby zmienić tytuł konsoli na unikatowy tytuł.

  3. Wywołaj metodę Sleep(40), aby upewnić się, że tytuł okna został zaktualizowany.

  4. Wywołanie FindWindow(NULL, uniquetitle), aby uzyskać HWND to wywołanie zwraca HWND - lub NULL, jeśli operacja nie powiodła się.

  5. Wywołaj polecenie SetConsoleTitle() z wartością pobraną z kroku 1, aby przywrócić oryginalny tytuł okna.

Należy przetestować wynikowy identyfikator HWND. Na przykład możesz sprawdzić, czy zwrócony identyfikator HWND odpowiada bieżącemu procesowi, wywołując obiekt GetWindowText() HWND i porównując wynik z GetConsoleTitle()wartością .

Wynikowe HWND nie ma gwarancji, że będzie odpowiedni dla wszystkich operacji obsługi okien.

Przykładowy kod

Poniższa funkcja pobiera bieżący uchwyt okna aplikacji konsoli (HWND). Jeśli funkcja powiedzie się, zwracana wartość to dojście do okna konsoli. Jeśli funkcja nie powiedzie się, zwracana wartość to NULL. Niektóre sprawdzanie błędów jest pomijane w celu zachowania zwięzłości.

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