長い間暫定版でしたが、先日”RtlMoveMemory”なる関数を見つけやっと実現することができました。
このサンプルの動作ですが、送信側のテキストボックスに文字列を入力すると、受信側のテキストボックスにリアルタイムに出力されます。
'/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_
'/_/
'/_/ 送信側アプリケーション
'/_/'/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_
Private SubText1_Change()
DimhWndToAs Long
DimsdtCOPYDATASTRUCTAsCOPYDATASTRUCT
sdtCOPYDATASTRUCT.dwData = 0
sdtCOPYDATASTRUCT.cbData = LenB(Text1.Text) + 1
IfText1.Text = ""Then
sdtCOPYDATASTRUCT.lpData = vbNullChar
Else
sdtCOPYDATASTRUCT.lpData = Text1.Text
End If
hWndTo = FindWindow(vbNullString, "受信フォーム")
IfhWndTo <> 0Then
Call SendMessage(hWndTo, WM_COPYDATA, Me.hwnd, sdtCOPYDATASTRUCT)
End If
End Sub
'-------------------------------------------------------
'Module
'-------------------------------------------------------
Public Declare FunctionFindWindowLib"user32"Alias"FindWindowA" (ByVallpClassNameAs String,ByVal lpWindowNameAs String)As Long
Public Declare FunctionSendMessageLib"user32"Alias"SendMessageA" (ByValhwndAs Long,ByValwMsgAs Long,ByValwParamAs Long, lParamAs Any)As Long
Public ConstWM_COPYDATA = &H4A
Type COPYDATASTRUCT
dwData As Long
cbData As Long
lpData As String '※注意 送信先はString型にします。
End Type
'/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_
'/_/
'/_/ 受信側アプリケーション
'/_/'/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_
Private SubForm_Activate()
CallHook(Me.hwnd)
End Sub
Private SubForm_QueryUnload(CancelAs Integer, UnloadModeAs Integer)
CallUnHook(Me.hwnd)
End Sub
'-------------------------------------------------------
' Module
'-------------------------------------------------------
Public Declare FunctionSetWindowLongLib"user32"Alias"SetWindowLongA" (ByValhwndAs Long,ByValnIndexAs Long,ByValdwNewLongAs Long)As Long
Public ConstGWL_WNDPROC = (-4)
Public Declare FunctionCallWindowProcLib"user32"Alias"CallWindowProcA" (ByVallpPrevWndFuncAs Long,ByValhwndAs Long,ByValMsgAs Long,ByValwParamAs Long,ByVallParamAs Long)As Long
Public ConstWM_COPYDATA = &H4A
PublicphWndAs Long
Public Declare Sub memcpy Lib "kernel32" Alias "RtlMoveMemory" (pDest As Any, pSrc As Any, ByVal iSize&)
Type COPYDATASTRUCT
dwData As Long
cbData As Long
lpData As Long
End Type
Public FunctionWndProc(ByValhwndAs Long,ByValuMsgAs Long,ByValwParamAs Long,ByVallParamAs Long)As LongStatic bolWndProcCheck As Boolean
Dim str As String
Dim lngret As Long
Dim sdtCOPYDATASTRUCT As COPYDATASTRUCT
If Not bolWndProcCheck Then
bolWndProcCheck = True
Select Case uMsg
Case WM_COPYDATA
Call memcpy(ByVal VarPtr(sdtCOPYDATASTRUCT), ByVal lParam&, LenB(sdtCOPYDATASTRUCT))
str = String$(sdtCOPYDATASTRUCT.cbData, vbNullChar)
Call memcpy(ByVal str, ByVal sdtCOPYDATASTRUCT.lpData, sdtCOPYDATASTRUCT.cbData)
Form1.Text1.Text = str
End Select
bolWndProcCheck = False
End If
WndProc = CallWindowProc(phWnd, hwnd, uMsg, wParam, lParam)
End Function
Public SubHook(hwndAs Long)
phWnd = SetWindowLong(hwnd, GWL_WNDPROC, AddressOf WndProc)
End Sub
Public SubUnHook(hwndAs Long)
DimlngretAs Long
IfphWnd <> 0Then
lngret = SetWindowLong(hwnd, GWL_WNDPROC, phWnd)
End If
End Sub
DownLoad vbtips096.lzh 4KB (VB6.0)