【VBA×WindowsAPI】MoveWindow関数の使い方
MoveWindow関数
MoveWindow関数は、指定したウィンドウの位置(X,Y)とサイズ(幅/高さ)をまとめて変更するための関数です。UserFormの場合は位置やサイズをプロパティで制御できるため、本関数を使う場面は多くありませんが、UserForm以外のウィンドウを移動・リサイズしたい場合に有効です。
MoveWindow関数は、取得済みのウィンドウハンドルに対して「移動」と「リサイズ」を一度の呼び出しで反映できるのが特徴です。たとえば指定のウィンドウを毎回同じ位置に固定したり、複数のツール用ウィンドウをタイル状に整列させたり、作業のたびに散らかるウィンドウ配置を起動時にリセットしたいときに便利です。
また、ShowWindow関数で最小化/復元した直後に本関数で位置を確定したり、SetForegroundWindow関数で前面化してから本関数で見やすい位置に移動する、といった組み合わせもよく使われます。
使用方法
MoveWindow関数を使用するにはあらかじめ関数の宣言しておく必要があります。
※宣言をしないと関数は使えずにエラーとなるので書き忘れに注意しましょう。
使用しているWindowsが32bitか64bitかによって宣言時に書く文言が違います。
環境に合わせて以下のいずれかをコードの一番初め(Option Explicitの次の行あたり)に書いておくことで、そのモジュール内で各関数を使うことができるようになります。
Declare PtrSafe Function MoveWindow Lib “user32" _
(ByVal hwnd As LongPtr, ByVal X As Long, ByVal Y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal bRepaint As Long) As Long
Declare Function MoveWindow Lib “user32" _
(ByVal hwnd As Long, ByVal X As Long, ByVal Y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal bRepaint As Long) As Long
上記のどちらを書けばいいかわからない場合は以下のコードをコピペして、モジュールの最上部に書いておきましょう。この構文を書いておくことで自動的に使うことのできる方の構文が使用されます。
VBE上では使えない方の構文が赤色で表示される場合がありますが、実行に影響はありません。
#If VBA7 Then
Declare PtrSafe Function MoveWindow Lib "user32" (ByVal hwnd As LongPtr, ByVal X As Long, ByVal Y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal bRepaint As Long) As Long
#Else
Declare Function MoveWindow Lib "user32" (ByVal hwnd As Long, ByVal X As Long, ByVal Y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal bRepaint As Long) As Long
#End If
各関数の宣言文は「Private/Public」を付けて各関数の有効範囲を指定することもできます。
・Public Declare PtrSafe Function~ :モジュール外で呼び出し有効
構文
MoveWindow関数の構文は下記のように書きます。
lRet = MoveWindow(hwnd, X, Y, nWidth, nHeight, bRepaint)
引数
hwnd (64bit:LongPtr型 / 32bit:Long型)
移動/サイズ変更したいウィンドウへのハンドルを指定します。
ウィンドウのハンドルはFindWindow関数などで取得します。
X (Long型)
ウィンドウ左上のX座標を指定します。(単位はピクセル)
Y (Long型)
ウィンドウ左上のY座標を指定します。(単位はピクセル)
nWidth (Long型)
ウィンドウの幅を指定します。(単位はピクセル)
nHeight (Long型)
ウィンドウの高さを指定します。(単位はピクセル)
bRepaint (Long型)
再描画を行うかどうかを指定します。通常は1(True)を指定します。
(0の場合は再描画を抑制する動きになります)
戻り値
lRet (Long型)
関数が成功した場合は0以外、失敗した場合は0が返ります。
サンプルコード
以下はFindWindow関数でメモ帳のウィンドウハンドルを取得し、MoveWindow関数で「位置とサイズ」を変更するサンプルコードです。メモ帳を起動した状態で実行してください。
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 MoveWindow Lib "user32" (ByVal hWnd As LongPtr, ByVal X As Long, ByVal Y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal bRepaint As Long) As Long
Sub main()
Dim hWnd As LongPtr
Dim lRet As Long
'メモ帳のハンドル取得
hWnd = FindWindow("Notepad", vbNullString)
'左上(50,50)へ移動し、幅420/高さ260に変更
lRet = MoveWindow(hWnd, 50, 50, 420, 260, 1)
If lRet = 0 Then
Call MsgBox("MoveWindow関数が失敗しました。", vbCritical)
End If
End Sub
VBA×WindowsAPIまとめページ
その他のWindowsAPI関数は下記ページにまとまっているので合わせて参照下さい。
参考
Microsoft公式:MoveWindow 関数 (winuser.h) – Win32 apps









