教えて!ExcelVBA!

ExcelVBAの基礎知識・書き方について紹介します。

【ExcelVBA API操作】ウィンドウに直接メッセージを送信しアプリケーションを終了(SendMessage)する方法を教えて!

f:id:m_kbou:20210522183249p:plain

開いているウィンドウに対して直接メッセージを送信してアプリケーションを終了させるWindowsAPI関数(SendMessage)について紹介します。

 

 

構文

記述方法は以下の通りとなります。

(API定義)

Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" (ByVal hWnd As Long, ByVal MSG As Long, ByVal wParam As Long, ByVal lParam As Long) As Long

----------------------------------------

(定数) 

Public Const メッセージ = &H112
Public Const ウィンドウ終了 = &HF060&

----------------------------------------

 (VBA記述)

SendMessage(hWnd, MSG, wParam, lParam)

[説明]:

ウィンドウに直接メッセージを送信するAPI関数はSendMessage関数となります。VBAから呼び出して使用する場合には、

---------------------------------

・定義

Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" (ByVal hWnd As Long, ByVal MSG As Long, ByVal wParam As Long, ByVal lParam As Long) As Long

・定数

Public Const メッセージ = &H112
Public Const ウィンドウ終了 = &HF060&

---------------------------------

をプロシージャ外で宣言します。

引数であるhWndにはメッセージを送信したいウィンドウハンドルを指定し、MSGにはメッセージの種類を指定し、wParamやlParamにはメッセージの内容を指定します。MSGについては定数で記述した「メッセージ種類」をセットし、wParamに定数で記述した「ウィンドウ終了」をセットします。SendMessage関数を実行すると戻り値が返りますが、送信するメッセージの種類により異なった内容となります。

 

使い方

使用方法について説明します。 

[プログラミング例]:

'*------------------------------------------
Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
'*------------------------------------------
Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" (ByVal hWnd As Long, ByVal MSG As Long, ByVal wParam As Long, ByVal lParam As Long) As Long

Public Const メッセージ = &H112
Public Const ウィンドウ終了 = &HF060&
'*------------------------------------------

Sub ウィンドウに直接メッセージを送信して特定アプリケーションを閉じる()

  '↓処理①
  Dim ウィンドウ As Long
  Dim 結果値 As Long

  '↓処理②
  ウィンドウ = FindWindow("Notepad", vbNullString)
  If (ウィンドウ = 0) Then
    MsgBox "メモ帳は起動されていません。"
    Exit Sub
  Else
    結果値 = SendMessage(ウィンドウ, メッセージ, ウィンドウ終了, 0)
    MsgBox "メモ帳を閉じました。(結果値:" & 結果値 & ")"
  End If

End Sub

処理の流れは以下の通りとなります。

[処理①]:変数定義
ウィンドウと結果値を格納する変数定義となります。

[処理②]:SendMessageによる直接メッセージの送信
WindowsAPI関数であるSendMessageを使用したウィンドウに直接メッセージを送信する方法となります。各引数には以下の内容をセットして処理を実行します。
・hWnd・・・ウィンドウハンドルをセットします。
   ※今回はFindWindow関数の戻り値である変数:ウィンドウをセットします。
・MSG・・・メッセージの種類をセットします。
   ※定数で指定した「メッセージ」をセットします。
・wParam・・・メッセージの内容をセットします。
   ※定数で指定した「ウィンドウ終了」をセットします。
・lParam・・・メッセージの内容をセットします。
   ※今回は指定しないため「0」をセットします。
実行する
と戻り値が返りますが、送信するメッセージの種類により異なった内容となります。

f:id:m_kbou:20210523002704p:plain

※上記のプログラミング例は、VBE(VBA記述画面)に記述しないと実行ができません。VBEの開き方についてはこちらを参考にして下さい。

[実行例]:

(事前準備)

事前にメモ帳を開きます。(※タスクバーを確認するとメモ帳が起動している事がわかります。)

f:id:m_kbou:20210516170748p:plain

①<実行>ボタンをクリックします。<実行>ボタンには上記のプログラミング例のプログラムが登録されています。(※ボタンにプログラムを割り当てるにはこちらを参考にして下さい。)

f:id:m_kbou:20210522183929p:plain

②MsgBoxで「メモ帳を閉じました。(結果値:0)」が表示されます。

f:id:m_kbou:20210522183351p:plain

③タスクバーを確認するとメモ帳が閉じた事がわかります。

f:id:m_kbou:20210522183507p:plain

[サンプル]:

上記で説明したファイルをダウンロードできます。ご自由にお使い下さい。

drive.google.com

ウィンドウに直接メッセージを送信する方法についての説明は以上です。

 

おわりに

今回はWindowsAPI関数によるウィンドウに直接メッセージを送信する方法について説明しました。是非参考にして下さい。