【VBA×WindowsAPI】IsWindow関数の使い方
IsWindow関数
IsWindow関数は指定のウィンドウが存在するかを判定するための関数です。
Windowsのウィンドウには「ウィンドウハンドル」というウィンドウを識別するための特別な識別子(数値データ)がそれぞれに割り振られています。WindowsAPIではこのハンドルを使うことで、指定のウィンドウを開いたり閉じたり、移動させたり、サイズを変えたり、テキストを変更したりするなどの様々な操作を行うことができるようになっています。(※ウィンドウ関連の関数はメインページを参照)
ウィンドウハンドルは、ウィンドウが作成されるときに自動的に割り当てられます。
そして、そのウィンドウが存在している間は一貫して有効ですが、ウィンドウが閉じられると無効になります。つまりハンドルを取得すると毎回値が違うウィンドウも存在するということです。
ウィンドウに対して何らかの操作を行う際には、対象のウィンドウが存在しているかを確認する必要がありますが、これを判定するためにIsWindow関数が利用されます。
使用方法
IsWindow関数を使用するにはあらかじめ関数の宣言しておく必要があります。
※宣言をしないと関数は使えずにエラーとなるので書き忘れに注意しましょう。
使用しているWindowsが32bitか64bitかによって宣言時に書く文言が違います。
環境に合わせて以下のいずれかをコードの一番初め(Option Explicitの次の行あたり)に書いておくことで、そのモジュール内で各関数を使うことができるようになります。
Declare PtrSafe Function IsWindow Lib “user32” (ByVal hwnd As LongPtr) As Long
Declare Function IsWindow Lib “user32” (ByVal hWnd As Long) As Long
記のどちらを書けばいいかわからない場合は以下のコードをコピペして、モジュールの最上部に書いておきましょう。この構文を書いておくことで自動的に使うことのできる方の構文が使用されます。
VBE上では使えない方の構文が赤色で表示される場合がありますが、実行に影響はありません。
1 2 3 4 5 |
#If VBA7 Then Declare PtrSafe Function IsWindow Lib "user32" (ByVal hwnd As LongPtr) As Long #Else Declare Function IsWindow Lib "user32" (ByVal hWnd As Long) As Long #End If |
各関数の宣言文は「Private/Public」を付けて各関数の有効範囲を指定することもできます。
・Public Declare PtrSafe Function~ :モジュール外で呼び出し有効
構文
IsWindow関数の構文は下記のように書きます。
lRet = IsWindow(hwnd)
引数
hwnd (64bit:LongPtr型 / 32bit:Long型)
存在確認をする対象のウィンドウのハンドルを入力します。
ウィンドウハンドルを取得するための関数としてFindWindow関数やGetActiveWindow関数、GetParent関数、GetNextWindow関数など様々なものがあります。
開発(実行)環境によって変数の型が変わるので注意が必要です。
戻り値
lRet (Long型)
戻り値はウィンドウが存在する場合は「0以外」、存在しない場合は「0」が返ります。
サンプルコード
以下はIsWindow関数を使って指定のウィンドウが存在するかを判定するサンプルコードです。
サンプルコードではExcelのハンドルを入力していますが、任意のウィンドウハンドルに切り替えることでそのウィンドウの存在確認をすることができます。指定のウィンドウのハンドルはFindWindow関数やGetActiveWindow関数などの別のWindowsAPIの関数を使うことで取得が可能です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
Declare PtrSafe Function IsWindow Lib "user32" (ByVal hWnd As LongPtr) As Long Sub main() Dim hWnd As LongPtr 'ウィンドウハンドルを取得 hWnd = Application.hWnd 'ウィンドウ存在確認 If IsWindow(hWnd) Then Debug.Print "存在する" Else Debug.Print "存在しない" End If End Sub |
VBA×WindowsAPIまとめページ
その他のWindowsAPI関数は下記ページにまとまっているので合わせて参照下さい。
参考
Microsoft公式:IsWindow 関数 (winuser.h) – Win32 apps