【VBA×WindowsAPI】SetWindowText関数の使い方
SetWindowText関数
SetWindowText関数は指定したウィンドウのタイトルバーの文字列(キャプション)を変更するための関数です。VBAでは「UserForm.Caption=”新しいウィンドウ名”」と書くことでUserFormのキャプションを変更することができます。SetWindowText関数を使うことで、これと同じように画面に表示されている任意のウィンドウのキャプションを指定した文字列に設定することが可能です。
※アプリケーションによってはSetWindowText関数でキャプションを変更できないものもあります。
ちなみにSetWindowText関数関数と関係性の深い関数として、指定ウィンドウのキャプションの文字数を取得するGetWindowTextLength関数や、対の存在となる指定したウィンドウのキャプションの文字列を取得するGetWindowText関数が存在します。
使用方法
SetWindowText関数を使用するにはあらかじめ関数の宣言しておく必要があります。
※宣言をしないと関数は使えずにエラーとなるので書き忘れに注意しましょう。
使用しているWindowsが32bitか64bitかによって宣言時に書く文言が違います。
環境に合わせて以下のいずれかをコードの一番初め(Option Explicitの次の行あたり)に書いておくことで、そのモジュール内で各関数を使うことができるようになります。
Declare PtrSafe Function SetWindowText Lib “user32” Alias “SetWindowTextA” _
(ByVal hwnd As LongPtr, ByVal lpString As String) As Long
Declare Function SetWindowText Lib “user32” Alias “SetWindowTextA” _
(ByVal hwnd As Long, ByVal lpString As String) As Long
上記のどちらを書けばいいかわからない場合は以下のコードをコピペして、モジュールの最上部に書いておきましょう。この構文を書いておくことで自動的に使うことのできる方の構文が使用されます。
VBE上では使えない方の構文が赤色で表示される場合がありますが、実行に影響はありません。
1 2 3 4 5 |
#If VBA7 Then Declare PtrSafe Function SetWindowText Lib "user32" Alias "SetWindowTextA" (ByVal hwnd As LongPtr, ByVal lpString As String) As Long #Else Declare Function SetWindowText Lib "user32" Alias "SetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String) As Long #End If |
各関数の宣言文は「Private/Public」を付けて各関数の有効範囲を指定することもできます。
・Public Declare PtrSafe Function~ :モジュール外で呼び出し有効
構文
SetWindowText関数の構文は下記のように書きます。
lRet = SetWindowText(hWnd, lpString)
引数
hWnd (64bit:LongPtr型 / 32bit:Long型)
ウィンドウ名(キャプション)を設定したいウィンドウのハンドルを入力します。
ウィンドウハンドルを取得するための関数としてFindWindow関数やGetActiveWindow関数、GetNextWindow関数、GetParent関数など様々なものがあります。
開発(実行)環境によって変数の型が変わるので注意が必要です。
lpString (String型)
ウィンドウ名に設定したい文字列を入力します。
戻り値
lRet (Long型)
戻り値は関数が成功した場合、0以外の値が返ります。
関数が失敗した場合は0が返されます。
サンプルコード
以下はFindWindow関数とSetWindowText関数を使って、指定のウィンドウのキャプションを変更するサンプルコードです。下記コードではメモ帳ウィンドウのうち最前面にあるウィンドウのキャプションを取得することができます。ちなみに「Notepad」部分(クラス名)を書き換えることでメモ帳以外の任意のアプリケーションを指定することもできます。
詳しくはFindWindow関数/GetClassName関数ページを参照下さい。
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 SetWindowText Lib "user32" Alias "SetWindowTextA" (ByVal hwnd As LongPtr, ByVal lpString As String) As Long Sub main() Dim hwnd As LongPtr Dim lRet As Long '最前面にあるメモ帳のウィンドウハンドルを取得 hwnd = FindWindow("Notepad", vbNullString) '取得したハンドルのウィンドウ名を変更する lRet = SetWindowText(hwnd, "新しいウィンドウ名") End Sub |
VBA×WindowsAPIまとめページ
その他のWindowsAPI関数は下記ページにまとまっているので合わせて参照下さい。
参考
Microsoft公式:SetWindowTextA 関数 (winuser.h) – Win32 apps