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