【VBA×WindowsAPI】ShowWindow関数の使い方
ShowWindow関数
ShowWindow関数は指定したウィンドウの表示状態を変更するための関数です。
ここでいう表示状態とは表示/非表示、最小化/最大化、復元などのことを指します。
ウィンドウハンドルは、ウィンドウを識別するための特別な識別子です。
ウィンドウを前面に出したり、最小化/最大化したり、非表示にしたりといった操作は、対象となるウィンドウのハンドルを指定して行います。ShowWindow関数も、その代表的な操作関数の一つです。
ウィンドウハンドルはC++では「HWND型」という型で扱いますが、中身としては長整数型の値であるためVBAではLongPtr型(32bitではLong型)を使用します。VBAでウィンドウハンドルを格納する変数はC++の型に合わせてhWndなどと記載することが多いです。
ShowWindow関数は「対象ウィンドウ」と「どう表示するか」の2つを指定します。
たとえば、UserFormをはじめとした特定のウィンドウを最小化したい/最大化したい、あるいは一時的に非表示にしたいというようなケースで利用できます。
使用方法
ShowWindow関数を使用するにはあらかじめ関数の宣言しておく必要があります。
※宣言をしないと関数は使えずにエラーとなるので書き忘れに注意しましょう。
使用しているWindowsが32bitか64bitかによって宣言時に書く文言が違います。
環境に合わせて以下のいずれかをコードの一番初め(Option Explicitの次の行あたり)に書いておくことで、そのモジュール内で各関数を使うことができるようになります。
Declare PtrSafe Function ShowWindow Lib “user32" _
(ByVal hwnd As LongPtr, ByVal nCmdShow As Long) As Long
Declare Function ShowWindow Lib “user32" _
(ByVal hwnd As Long, ByVal nCmdShow As Long) As Long
上記のどちらを書けばいいかわからない場合は以下のコードをコピペして、モジュールの最上部に書いておきましょう。この構文を書いておくことで自動的に使うことのできる方の構文が使用されます。
VBE上では使えない方の構文が赤色で表示される場合がありますが、実行に影響はありません。
#If VBA7 Then
Declare PtrSafe Function ShowWindow Lib "user32" (ByVal hwnd As LongPtr, ByVal nCmdShow As Long) As Long
#Else
Declare Function ShowWindow Lib "user32" (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long
#End If
各関数の宣言文は「Private/Public」を付けて各関数の有効範囲を指定することもできます。
・Public Declare PtrSafe Function~ :モジュール外で呼び出し有効
構文
ShowWindow関数の構文は下記のように書きます。
lRet = ShowWindow(hwnd, nCmdShow)
引数
hwnd (64bit:LongPtr型 / 32bit:Long型)
表示状態を変更したいウィンドウへのハンドルを指定します。
UserFormのハンドルはFindWindow関数などで取得します。
nCmdShow (Long型)
ウィンドウをどの状態で表示するかを指定します。代表的な値は以下の通りです。
| 定数 | 説明 |
| SW_HIDE (0) | ウィンドウを非表示にする |
| SW_SHOWNORMAL (1) | 通常表示(復元)する |
| SW_SHOWMINIMIZED (2) | 最小化して表示する |
| SW_SHOWMAXIMIZED (3) | 最大化して表示する |
| SW_SHOWNOACTIVATE (4) | アクティブにせず表示する |
| SW_SHOW (5) | 現在のサイズ/位置で表示する |
| SW_MINIMIZE (6) | 最小化する |
| SW_SHOWMINNOACTIVE (7) | アクティブにせず最小化表示する |
| SW_SHOWNA (8) | アクティブにせず表示する |
| SW_RESTORE (9) | 最小化/最大化状態から復元する |
| SW_SHOWDEFAULT (10) | 既定の状態で表示する |
| SW_FORCEMINIMIZE (11) | 強制的に最小化する |
VBAでは以下のように定数を定義して使うと分かりやすいです。
Public Const SW_HIDE As Long = 0 Public Const SW_SHOWNORMAL As Long = 1 Public Const SW_SHOWMINIMIZED As Long = 2 Public Const SW_SHOWMAXIMIZED As Long = 3 Public Const SW_SHOWNOACTIVATE As Long = 4 Public Const SW_SHOW As Long = 5 Public Const SW_MINIMIZE As Long = 6 Public Const SW_SHOWMINNOACTIVE As Long = 7 Public Const SW_SHOWNA As Long = 8 Public Const SW_RESTORE As Long = 9 Public Const SW_SHOWDEFAULT As Long = 10 Public Const SW_FORCEMINIMIZE As Long = 11
戻り値
lRet (Long型)
戻り値は「呼び出し前にウィンドウが表示されていたか」を示します。
0の場合は呼び出し前は非表示、0以外の場合は呼び出し前は表示状態です。
サンプルコード
以下はFindWindow関数でUserFormのウィンドウハンドルを取得し、ShowWindow関数で「最小化→復元→非表示→再表示」を行うサンプルコードです。(※UserForm1を作成しておくこと)
Option Explicit
Private Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr
Private Declare PtrSafe Function ShowWindow Lib "user32" (ByVal hWnd As LongPtr, ByVal nCmdShow As Long) As Long
Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Private Const SW_HIDE As Long = 0
Private Const SW_SHOWNORMAL As Long = 1
Private Const SW_MINIMIZE As Long = 6
Private Const SW_RESTORE As Long = 9
Sub main()
Dim hWnd As LongPtr
Dim lRet As Long
'モードレスで表示(Captionでハンドル取得するため)
UserForm1.Show vbModeless
'UserFormのハンドル取得(キャプション名で探索)
hWnd = FindWindow(vbNullString, UserForm1.Caption)
'最小化
Call Sleep(1000)
lRet = ShowWindow(hWnd, SW_MINIMIZE)
'復元
Call Sleep(1000)
lRet = ShowWindow(hWnd, SW_RESTORE)
'非表示
Call Sleep(1000)
lRet = ShowWindow(hWnd, SW_HIDE)
'再表示
Call Sleep(1000)
lRet = ShowWindow(hWnd, SW_SHOWNORMAL)
End Sub
VBA×WindowsAPIまとめページ
その他のWindowsAPI関数は下記ページにまとまっているので合わせて参照下さい。
参考
Microsoft公式:ShowWindow 関数 (winuser.h) – Win32 apps









