Windows上でプログラムからウィンドウの操作を行う場合、「ウィンドウハンドル」と呼ばれるウィンドウを識別するためのハンドルを使用します。
// ウィンドウの位置・サイズ設定
::MoveWindow(hWnd, 0, 0, 100, 100, TRUE);
ウィンドウハンドルを使用したウィンドウ操作の一例として以下のような操作を行うことができます。
- ウィンドウ位置の移動
- ウィンドウサイズの変更
- ウィンドウの最前面化固定
- ウィンドウスタイルの変更
この記事では、任意のウィンドウのハンドルを取得する方法について紹介します。
プロジェクト内のウィンドウのハンドルを取得
操作を行いたいウィンドウが同一プロジェクト内に存在する場合、対象ウィンドウのインスタンスを取得することができればハンドルを取得できます。
// ウィンドウのインスタンス
CDialogEx* pDlg = /* インスタンス */;
// ウィンドウハンドル取得
HWND hWnd = pDlg->GetSafeHwnd();
同一プロジェクト内でもインスタンスを取得できない場合には「他アプリのウィンドウのハンドルを取得」の方法でハンドルを取得します。
また、別プロジェクトであってもウィンドウのインスタンスを取得することができるのであれば、上記の方法でハンドルを取得することができます。
他アプリのウィンドウのハンドルを取得
操作を行いたいウィンドウが他アプリのウィンドウの場合、ウィンドウ名(ウィンドウタイトル)またはクラス名をFindWindowに渡すことでハンドルを取得できます。
// ウィンドウハンドル取得(ウィンドウ名、クラス名指定)
HWND hWnd1 = ::FindWindow(_T("クラス名"), _T("ウィンドウ名"));
// ウィンドウハンドル取得(ウィンドウ名のみ指定)
HWND hWnd2 = ::FindWindow(nullptr, _T("ウィンドウ名"));
// ウィンドウハンドル取得(クラス名のみ指定)
HWND hWnd3 = ::FindWindow(_T("クラス名"), nullptr);
ウィンドウ名は対象ウィンドウのタイトルなのでわかりやすいですが、アプリケーション名とフォルダ名が同じ場合などにどちらのハンドルが取得できるかわからなくなる場合があります。
クラス名の取得方法については以下の記事を参考にしてみてください。
spy++を使ってクラス名を調べる方法 | 自動マクロプログラミング
終わりに
任意のウィンドウのハンドルを取得する方法について紹介しました。
他のウィンドウを操作する場合にはウィンドウハンドルは必須となるので、ウィンドウハンドルの取得方法は覚えておいたほうが良いでしょう。
この記事について誤っている点・不明な点などありましたらコメントまでお願いします。
コメント