NonSoft

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


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

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

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

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

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

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

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

    Private Sub Button1_Click( _
        ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        ' 独自メッセージ送信
        SendMessage(Me.Handle, 9999, 0, 0)
    End Sub
    ' ============================================================================================

    ' 独自(カスタム)メッセージ受信側の処理========================================================
    Private Sub Form1_Load( _
        ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        ' 独自メッセージの処理を開始
        Class1.Start_MyWndProc(Me.Handle)
    End Sub

    Private Sub Form1_FormClosed(ByVal sender As System.Object, _
        ByVal e As System.Windows.Forms.FormClosedEventArgs) Handles MyBase.FormClosed
        ' 独自メッセージの処理を終了
        Class1.End_MyWndProc(Me.Handle)
    End Sub
    ' ============================================================================================
End Class

★クラス(Class1.vb)
Public Class Class1
    ' 独自(カスタム)メッセージ処理モジュール======================================================
    ' メッセージ処理関数用デリゲート
    Private Delegate Function D_MyWndProc( _
        ByVal hwnd As Integer, ByVal msg As Integer, _
        ByVal wParam As Integer, ByVal lParam As Integer) As Integer

    ' ウィンドウをサブクラス化するAPI
    Private Const GWL_WNDPROC = -4
    Private Declare Function GetWindowLong Lib "user32.dll" Alias "GetWindowLongA" _
        (ByVal hwnd As Integer, ByVal nIndex As Integer) As Integer
    Private Declare Function SetWindowLong Lib "user32.dll" Alias "SetWindowLongA" _
        (ByVal hwnd As Integer, ByVal nIndex As Integer, ByVal dwNewLong As Integer) As Integer
    Private Declare Function SetWindowLong Lib "user32.dll" Alias "SetWindowLongA" _
        (ByVal hwnd As Integer, ByVal nIndex As Integer, ByVal dwNewLong As D_MyWndProc) As Integer
    Private Declare Function CallWindowProc Lib "user32.dll" Alias "CallWindowProcA" _
        (ByVal lpPrevWndFunc As Integer, ByVal hwnd As Integer, ByVal msg As Integer, _
         ByVal wParam As Integer, ByVal lParam As Integer) As Integer

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

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

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

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