【VBA×WindowsAPI】FindWindow関数を部分一致に対応させる

Windows APIのFindWindow関数を使うと、指定したウィンドウのハンドルを取得できます。このハンドルを利用することで、ウィンドウを最前面に表示したり、透過させたりすることが可能です。この関数は、ウィンドウのクラス名とウィンドウ名を指定することで対象のウィンドウのハンドルを取得することができます。ただし、これらの値は完全に一致している必要があります。

すでにFindWindow関数を利用したことがある方はご存じだと思いますが、部分一致で検索したいと思う場面は少なくありません。たとえば、あるアプリケーションのハンドルを取得したい場合、そのタイトルに開いているファイル名が含まれるケースがあります。このような場合、動的に一致する文字列を生成しなければならずかなり煩わしいですが、FindWindow関数だけでなくそれ以外のWindows APIの関数も併用することでこの問題を解決することができます

部分一致FindWindow関数

FindWindow関数を部分一致に対応させる方法は非常にシンプルです。FindWindow関数で取得できるのは最上位の親ウィンドウなので、すべての最上位ウィンドウのクラス名とウィンドウ名を順に探索し、入力値と部分一致するかを判定して条件に合致するウィンドウを取得するだけです。

下記のWindows API関数を使うことで部分一致に対応したFindWindow関数を作成することができます。それぞれの関数のより詳細な使い方の解説は各関数のリンクページを参照下さい。

icon-check-square FindWindow関数          :ウィンドウのハンドルを取得する
icon-check-square IsWindowVisible関数  :ウィンドウが可視状態であるかを判定する
icon-check-square GetClassName関数     :ウィンドウのクラス名を取得する
icon-check-square GetWindowText関数      :ウィンドウのウィンドウ名(タイトル)を取得する
icon-check-square GetNextWindow関数     :指定のウィンドウの次にあるウィンドウのハンドルを取得する

最上位の親ウィンドウを探索してウィンドウ名をすべて取得する方法は下記で解説しているので合わせて参照ください。後述のサンプルコードは本内容の処理に少し処理を追加しただけのものです。

サンプルコード

FindWindow関数を部分一致対応させた関数は下記の通りです。FindWindow関数の代わりにFindWindowPartialMatch関数を利用することで、クラス名とウィンドウ名を部分一致で探索することができます。Optional引数の値を切り替えることで部分一致と完全一致を切り替えることも可能です。

上記コードではGetNextWindow関数で次のウィンドウを取得していますが、FindWindowEx関数でも同等の操作を行うことができます。

関連情報

icon-share-square VBA×WindowsAPIまとめページ

その他のWindowsAPI関数は下記ページにまとまっているので合わせて参照下さい。

icon-share-square 参考

Microsoft公式:FindWindowA 関数 (winuser.h) – Win32 apps

Excel, VBA, Windows API

Posted by Lic