[已解决]怎么接收别的进程发来的 WM_COPYDATA 消息?
本帖最后由 f4李文杨 于 2021-3-20 09:42 编辑不好意思,怪我没有说清楚,别的程序会以参数型式获取,我自已程序的窗口句柄,发送 WM_COPYDATA 消息!
以下是一位大老以前源码,对AU3 之间的进程通信是有用!但是接收其它程序发来的信息是无反应。。。。。
$Form2 = GUICreate('Msg_Rec')
Run('D:\ProxyTool\ProxyAPI.exe-c-hwnd=' &WinGetHandle($Form2))//调其它程序参数 窗口句柄
GUIRegisterMsg(0x4A, '_Msg_Rec');注册函数来接收
Func _Msg_Rec($hWnd, $iMsg, $iwParam, $ilParam)
$a = DllStructCreate('dword var1;dword var2;ptr var3', $ilParam)
$b = DllStructGetData($a, 3)
$c = DllStructCreate('wchar var1', $b)
$d = DllStructGetData($c, 1)
MsgBox(0, '接收端收到', $d)
EndFunc
问题以解决,gyp2000 大神给出了问题解决的方式了!
请版主帮移到解决区,谢谢!我不知道那里移! f4李文杨 发表于 2021-3-18 20:55
楼上的几位大神帮忙看看!
收不到消息的原因,应该是你的窗口没有创建完成。
需要执行 GUISetState()
必须要设置窗口状态,窗口才能正常工作。
本帖最后由 afan 于 2021-3-18 09:16 编辑
这里并未说明其它程序怎么发送的0x4A (WM_COPYDATA) 消息
BTW, 标题错别字辣眼睛。 我同意楼上的观点,并未看到其他程序是怎么发送的。
另外我记得,这个消息的函数得有返回值才会正常。 haijie1223 发表于 2021-3-18 18:26
我同意楼上的观点,并未看到其他程序是怎么发送的。
另外我记得,这个消息的函数得有返回值才会正常。
这个不需要返回值的 需要完整代码,例子不可能就那么一个函数就能完成进程间通讯。至少要有窗体。而且这个是同步通讯,接收消息后需要立即返回。如果弹出对话框会导致发送端卡死。 楼上的几位大神帮忙看看! 本帖最后由 gyp2000 于 2021-3-19 07:24 编辑
不知道你的发送端是如何写的代码,只能给你发个例子了。。
接收端
#include <WindowsConstants.au3>
#include <WinAPISysWin.au3>
#include <APISysConstants.au3>
#include <AutoItConstants.au3>
Global $hGUI,$COPYDATA
Global Const $iWM_COPYDATA = _WM_COPYDATA_Start()
While 1
$iMsg = GUIGetMsg()
Switch $iMsg
Case $iWM_COPYDATA
$vDummyValue = _WM_COPYDATA_GetData()
;ToolTip($vDummyValue)
ConsoleWrite($vDummyValue&@CRLF)
$vDummyValue = 0
Case Else
EndSwitch
WEnd
Func _WM_COPYDATA_GetData()
Local $sReturn = $COPYDATA
$COPYDATA = ''
Return $sReturn
EndFunc
Func _WM_COPYDATA_Start()
Local$idDummy
$hGUI = GUICreate('{6C90F37A-228E-3787-A733-342BCD36CAFB}', 0, 0, -99, -99, '', $WS_EX_TOOLWINDOW)
GUISetState(@SW_SHOW, $hGUI)
If IsAdmin() Then
_WinAPI_ChangeWindowMessageFilterEx($hGUI, $WM_COPYDATA, $MSGFLT_ALLOW)
EndIf
GUIRegisterMsg($WM_COPYDATA, '_WM_COPYDATA')
$idDummy = GUICtrlCreateDummy()
Return $idDummy
EndFunc
Func _WM_COPYDATA($hWnd, $iMsg, $wParam, $lParam)
#forceref $hWnd, $iMsg, $wParam
Local Const $tagCOPYDATASTRUCT = 'ptr;dword;ptr' ; 'ulong_ptr;dword;ptr'
Local Const $tParam = DllStructCreate($tagCOPYDATASTRUCT, $lParam)
Local Const $tData = DllStructCreate('wchar[' & DllStructGetData($tParam, 2) + 1 & ']', DllStructGetData($tParam, 3)) ; wchar
$COPYDATA = StringLeft(DllStructGetData($tData, 1), DllStructGetData($tParam, 2))
GUICtrlSendToDummy($iWM_COPYDATA)
EndFunc
发送端
#include <WindowsConstants.au3>
#include <SendMessage.au3>
$hWnd = WinGetHandle('{6C90F37A-228E-3787-A733-342BCD36CAFB}')
For $s =1 To 10
_COPYDATA_Send($hWnd, "这是一个COPYDATA消息")
Next
Func _COPYDATA_Send($hWnd, $sMsg)
Local Const $tBuffer = DllStructCreate('wchar cdata[' & StringLen($sMsg) + 1 & ']')
DllStructSetData($tBuffer, 'cdata', $sMsg)
Local Const $tagCOPYDATASTRUCT = 'ptr dwData;dword cbData;ptr lpData' ; 'ulong_ptr dwData;dword cbData;ptr lpData'
Local Const $tCOPYDATASTRUCT = DllStructCreate($tagCOPYDATASTRUCT)
DllStructSetData($tCOPYDATASTRUCT, 'dwData', 0)
DllStructSetData($tCOPYDATASTRUCT, 'cbData', DllStructGetSize($tBuffer))
DllStructSetData($tCOPYDATASTRUCT, 'lpData', DllStructGetPtr($tBuffer))
_SendMessage($hWnd, $WM_COPYDATA, 0, DllStructGetPtr($tCOPYDATASTRUCT))
Return Number(Not @error)
EndFunc
gyp2000 发表于 2021-3-19 02:14
收不到消息的原因,应该是你的窗口没有创建完成。
需要执行 GUISetState()
必须要设置窗口状态,窗口才 ...
非常感谢你的帮助,解决了我的问题! f4李文杨 发表于 2021-3-20 09:35
非常感谢你的帮助,解决了我的问题!
看到你一楼的 WinGetHandle($Form2) 以为是示例伪代码,没想到是实际的代码……
$Form2 = GUICreate('Msg_Rec')
Run('D:\ProxyTool\ProxyAPI.exe-c-hwnd=' &WinGetHandle($Form2))//调其它程序参数 窗口句柄 <<< 这里为什么还要 WinGetHandle($Form2)?直接用 $Form2
GUIRegisterMsg(0x4A, '_Msg_Rec');注册函数来接收 <<< 消息注册在上面发送之后?鬼才收得到……
页:
[1]