教えて!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関数によるウィンドウに直接メッセージを送信する方法について説明しました。是非参考にして下さい。