|
|||||
<このサンプルの概要> 外部アプリケーションから送信された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 |