コンソール ウィンドウ ハンドル (HWND) を取得する方法

この記事では、コンソール ウィンドウ ハンドル (HWND) を取得する方法について説明します。

適用対象: Windows Server 2012 R2
元の KB 番号: 124103

概要

コンソール アプリケーションに関連付けられているウィンドウを操作すると便利な場合があります。 Win32 API には、コンソール アプリケーションに関連付けられているウィンドウ ハンドルを取得するための直接メソッドは用意されません。 ただし、 を呼び出 FindWindow()すことでウィンドウ ハンドルを取得できます。 この関数は、クラス名またはウィンドウ名に基づいてウィンドウ ハンドルを取得します。

を呼び出 GetConsoleTitle() して、現在のコンソール タイトルを決定します。 次に、現在のコンソール タイトルを に指定 FindWindow()します。

詳細

複数のウィンドウに同じタイトルがある場合があるため、現在のコンソール ウィンドウのタイトルを一意のタイトルに変更する必要があります。 これは、間違ったウィンドウ ハンドルが返されるのを防ぐのに役立ちます。 を使用して SetConsoleTitle() 、現在のコンソール ウィンドウのタイトルを変更します。 プロセスを次に示します。

  1. を呼び出 GetConsoleTitle() して、現在のコンソール ウィンドウのタイトルを保存します。

  2. を呼び出 SetConsoleTitle() して、コンソール タイトルを一意のタイトルに変更します。

  3. ウィンドウ タイトルが更新されたことを確認するには、Sleep(40) を呼び出します。

  4. 呼び出し FindWindow(NULL、uniquetitle)、HWND を取得するには、この呼び出しは、操作が失敗した場合に HWND または NULL を返します。

  5. 元のウィンドウ タイトルを復元するには、手順 1 から取得した値を指定して を呼び出 SetConsoleTitle() します。

結果の HWND をテストする必要があります。 たとえば、返された HWND が現在のプロセスに対応しているかどうかをテストするには、HWND で を呼び出 GetWindowText() し、結果を と 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);
   }