次の方法で共有


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

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

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