找回密码
 加入
搜索
查看: 1936|回复: 9

[网络通信] [已解决]怎么接收别的进程发来的 WM_COPYDATA 消息?

[复制链接]
发表于 2021-3-18 03:03:38 | 显示全部楼层 |阅读模式
本帖最后由 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[1000]', $b)
        $d = DllStructGetData($c, 1)

        MsgBox(0, '接收端收到', $d)
EndFunc

问题以解决,gyp2000 大神给出了问题解决的方式了!

请版主帮移到解决区,谢谢!我不知道那里移!
发表于 2021-3-19 02:14:19 | 显示全部楼层
f4李文杨 发表于 2021-3-18 20:55
楼上的几位大神帮忙看看!

收不到消息的原因,应该是你的窗口没有创建完成。
需要执行 GUISetState()
必须要设置窗口状态,窗口才能正常工作。

发表于 2021-3-18 09:09:14 | 显示全部楼层
本帖最后由 afan 于 2021-3-18 09:16 编辑

这里并未说明其它程序怎么发送的0x4A (WM_COPYDATA) 消息

BTW, 标题错别字辣眼睛。
发表于 2021-3-18 18:26:58 | 显示全部楼层
我同意楼上的观点,并未看到其他程序是怎么发送的。
另外我记得,这个消息的函数得有返回值才会正常。
发表于 2021-3-18 18:36:21 | 显示全部楼层
haijie1223 发表于 2021-3-18 18:26
我同意楼上的观点,并未看到其他程序是怎么发送的。
另外我记得,这个消息的函数得有返回值才会正常。

这个不需要返回值的
发表于 2021-3-18 19:05:33 来自手机 | 显示全部楼层
需要完整代码,例子不可能就那么一个函数就能完成进程间通讯。至少要有窗体。而且这个是同步通讯,接收消息后需要立即返回。如果弹出对话框会导致发送端卡死。
 楼主| 发表于 2021-3-18 20:55:25 | 显示全部楼层
楼上的几位大神帮忙看看!
发表于 2021-3-19 01:06:49 | 显示全部楼层
本帖最后由 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  



评分

参与人数 1金钱 +33 收起 理由
f4李文杨 + 33 赞一个!很有难心的一位大神!

查看全部评分

 楼主| 发表于 2021-3-20 09:35:44 | 显示全部楼层
gyp2000 发表于 2021-3-19 02:14
收不到消息的原因,应该是你的窗口没有创建完成。
需要执行 GUISetState()
必须要设置窗口状态,窗口才 ...

非常感谢你的帮助,解决了我的问题!
发表于 2021-3-20 09:43:43 | 显示全部楼层
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');注册函数来接收 <<< 消息注册在上面发送之后?鬼才收得到……
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-12-23 02:46 , Processed in 0.112701 second(s), 25 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表