【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の次の行あたり)に書いておくことで、そのモジュール内で各関数を使うことができるようになります。

 icon-code  64bit  

Declare PtrSafe Function SetForegroundWindow Lib “user32” _
(ByVal hwnd As LongPtr) As Long

icon-code  32bit  

Declare Function SetForegroundWindow Lib “user32” (ByVal hwnd As Long) As Long

上記のどちらを書けばいいかわからない場合は以下のコードをコピペして、モジュールの最上部に書いておきましょう。この構文を書いておくことで自動的に使うことのできる方の構文が使用されます。
VBE上では使えない方の構文が赤色で表示される場合がありますが、実行に影響はありません。

 
各関数の宣言文は「Private/Public」を付けて各関数の有効範囲を指定することもできます。

Private Declare PtrSafe Function~ :モジュール内でのみ呼び出し有効
Public Declare PtrSafe Function~ :モジュール外で呼び出し有効

 
 

構文

SetForegroundWindow関数の構文は下記のように書きます。

icon-code SetForegroundWindow関数 

lRet = SetForegroundWindow(hwnd)

引数

 hwnd     (64bit:LongPtr型 / 32bit:Long型) 

最前面に表示させたいウィンドウのハンドルを入力します。
ウィンドウハンドルを取得するための関数としてFindWindow関数FindWindowEx関数GetActiveWindow関数GetNextWindow関数など様々なものがあります。
開発(実行)環境によって変数の型が変わるので注意が必要です。
 

戻り値

 lRet    (Long型) 

戻り値はウィンドウが最前面に移動された場合は「0以外」が、
ウィンドウが最前面に移動されなかった場合は「0」が返されます。

 

サンプルコード

以下はSetForegroundWindow関数FindWindow関数を使って、メモ帳のウィンドウを最前面に表示させるサンプルコードです。メモ帳ウィンドウを1つ以上開いた状態で実行すれば、メモ帳ウィンドウを最前面に表示させることが可能です。ウィンドウが最小化されている場合、画面上に表示されませんが内部的には最前面表示が適用されます。

 

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

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

 icon-share-square  参考

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

Excel, VBA, Windows API

Posted by Lic