【VBA×WindowsAPI】SetForegroundWindow関数の使い方
SetForegroundWindow関数
SetForegroundWindow関数は指定のウィンドウを最前面に表示するための関数です。
ウィンドウの指定にはウィンドウハンドルを使用します。
ウィンドウハンドルとは、ウィンドウを識別するための特別な識別子です。
ウィンドウを開いたり閉じたり、移動させたり、サイズを変えたり、テキストを変更したりするなど、ウィンドウに対して行いたい様々な操作を指示する際に使用します。このウィンドウに対する操作もWindowAPIに用意されている何種類もの関数で行うことが可能です。
ウィンドウハンドルはC++では「HWND型」という型で扱いますが、中身としては長整数型の値であるためVBAではLongPtr型(32bitではLong型)を使用します。VBAでウィンドウハンドルを格納する変数はC++の型に合わせてhWndなどと記載することが多いです。
ウィンドウハンドルは、ウィンドウが作成されるときに自動的に割り当てられます。
そして、そのウィンドウが存在している間は一貫して有効ですが、ウィンドウが閉じられると無効になります。つまりハンドルを取得すると毎回値が違うウィンドウも存在するということです。
ウィンドウハンドルを取得するためには専用のWindowAPIの関数を利用します。FindWindow関数やFindWindowEx関数、GetActiveWindow関数、GetNextWindow関数、GetParent関数などいくつもの関数が用意されているので状況によって使い分けることができます。
VBAでのSetForegroundWindow関数の使いどころとしては処理が終わった後に指定のウィンドウを確実に表示させたいという場合や、進捗バーが他のウィンドウで隠されないように最前面で表示させ続けたいという場合などの、主にユーザ目線で見たときに使いやすくするために実装されことが多いです。
使用方法
SetForegroundWindow関数を使用するにはあらかじめ関数の宣言しておく必要があります。
※宣言をしないと関数は使えずにエラーとなるので書き忘れに注意しましょう。
使用しているWindowsが32bitか64bitかによって宣言時に書く文言が違います。
環境に合わせて以下のいずれかをコードの一番初め(Option Explicitの次の行あたり)に書いておくことで、そのモジュール内で各関数を使うことができるようになります。
Declare PtrSafe Function SetForegroundWindow Lib “user32” _
(ByVal hwnd As LongPtr) As Long
Declare Function SetForegroundWindow Lib “user32” (ByVal hwnd As Long) As Long
上記のどちらを書けばいいかわからない場合は以下のコードをコピペして、モジュールの最上部に書いておきましょう。この構文を書いておくことで自動的に使うことのできる方の構文が使用されます。
VBE上では使えない方の構文が赤色で表示される場合がありますが、実行に影響はありません。
1 2 3 4 5 |
#If VBA7 Then Declare PtrSafe Function SetForegroundWindow Lib "user32" (ByVal hwnd As LongPtr) As Long #Else Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Long) As Long #End If |
各関数の宣言文は「Private/Public」を付けて各関数の有効範囲を指定することもできます。
・Public Declare PtrSafe Function~ :モジュール外で呼び出し有効
構文
SetForegroundWindow関数の構文は下記のように書きます。
lRet = SetForegroundWindow(hwnd)
引数
hwnd (64bit:LongPtr型 / 32bit:Long型)
最前面に表示させたいウィンドウのハンドルを入力します。
ウィンドウハンドルを取得するための関数としてFindWindow関数やFindWindowEx関数、GetActiveWindow関数、GetNextWindow関数など様々なものがあります。
開発(実行)環境によって変数の型が変わるので注意が必要です。
戻り値
lRet (Long型)
戻り値はウィンドウが最前面に移動された場合は「0以外」が、
ウィンドウが最前面に移動されなかった場合は「0」が返されます。
サンプルコード
以下はSetForegroundWindow関数とFindWindow関数を使って、メモ帳のウィンドウを最前面に表示させるサンプルコードです。メモ帳ウィンドウを1つ以上開いた状態で実行すれば、メモ帳ウィンドウを最前面に表示させることが可能です。ウィンドウが最小化されている場合、画面上に表示されませんが内部的には最前面表示が適用されます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr Declare PtrSafe Function SetForegroundWindow Lib "user32" (ByVal hWnd As LongPtr) As Long Sub main() Dim hWnd As LongPtr Dim lRet As Long 'メモ帳のウィンドウハンドル取得(複数ある場合は最も前にあるウィンドウ) hWnd = FindWindow("notepad", vbNullString) 'メモ帳ウィンドウを最前面表示 lRet = SetForegroundWindow(hWnd) End Sub |
VBA×WindowsAPIまとめページ
その他のWindowsAPI関数は下記ページにまとまっているので合わせて参照下さい。
参考
Microsoft公式:SetForegroundWindow 関数 (winuser.h) – Win32 apps