NonSoft

Windowsメッセージを送信/受信するサンプル(VB6)


 サンプル(ソース/コード)
<このサンプルの概要>
外部アプリケーションから送信されたWindowsメッセージをVB6のウィンドウで受信するサンプルです。

外部アプリケーション(他EXE)に指令を送信する手段としてWindowsメッセージがあります。
WindowsメッセージとはWM_XXXX(例:WM_GETTEXTやWM_SETTEXT)で表現されているメッセージです。
Windowsメッセージは通常、OSとAPの間で送受信されますが、AP間でも送受信が可能です。

WindowsメッセージはSendMessageやPostMessageで送信出来ます。

そのWindowsメッセージをVB6のウィンドウ(フォームやコントロール)で受信するには、
サブクラス化という処理が必要です。

このサンプルでは、VB6のサブクラス化の処理をシンプルにまとめました。
サンプルを簡単にするためWindowsメッセージ送信側と受信側を同じフォームに記述しています。

VB.NETやC#.NETのサンプルはこちらです。
Windowsメッセージを送信/受信するサンプル(VB.NET)
Windowsメッセージを送信/受信するサンプル(C#.NET)

★フォームモジュール(Form1.frm)
Option Explicit

' 独自(カスタム)メッセージ送信側の処理========================================================
' ウィンドウにメッセージを送信するAPI
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
    (ByVal hwnd As Long, ByVal msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long

Private Sub Command1_Click()
    ' 独自メッセージ送信
    Call SendMessage(Me.hwnd, 9999, 0, 0)
End Sub
' ============================================================================================


' 独自(カスタム)メッセージ受信側の処理========================================================
Private Sub Form_Load()
    ' 独自メッセージの処理を開始
    Call Start_MyWndProc(Me.hwnd)
End Sub

Private Sub Form_Unload(Cancel As Integer)
    ' 独自メッセージの処理を終了
    Call End_MyWndProc(Me.hwnd)
End Sub
' ============================================================================================

★標準モジュール(Module1.bas)
Option Explicit

' 独自(カスタム)メッセージ処理モジュール======================================================
' ウィンドウをサブクラス化するAPI
Private Const GWL_WNDPROC = -4
Private Declare Function GetWindowLong Lib "user32.dll" Alias "GetWindowLongA" _
    (ByVal hwnd As Long, ByVal nIndex As Long) As Long
Private Declare Function SetWindowLong Lib "user32.dll" Alias "SetWindowLongA" _
    (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare Function CallWindowProc Lib "user32.dll" Alias "CallWindowProcA" _
    (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal msg As Long, _
     ByVal wParam As Long, ByVal lParam As Long) As Long

' デフォルトのメッセージ処理関数
Private lngWnP As Long

' 独自メッセージの処理を開始
Public Sub Start_MyWndProc(hwnd As Long)
    lngWnP = GetWindowLong(hwnd, GWL_WNDPROC)
    Call SetWindowLong(hwnd, GWL_WNDPROC, AddressOf MyWndProc)
End Sub

' 独自メッセージの処理を終了
Public Sub End_MyWndProc(hwnd As Long)
    Call SetWindowLong(hwnd, GWL_WNDPROC, lngWnP)
End Sub

' ウィンドウに来たメッセージを振り分ける関数
Private Function MyWndProc( _
    ByVal hwnd As Long, ByVal msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    MyWndProc = 0
    Select Case msg
    Case 9999
        ' 独自メッセージ(9999)の処理
        MsgBox "メッセージを受信しました"
    Case Else
        ' デフォルトのメッセージ処理
        MyWndProc = CallWindowProc(lngWnP, hwnd, msg, wParam, lParam)
    End Select
End Function
' ============================================================================================