f4李文杨 发表于 2021-3-18 03:03:38

[已解决]怎么接收别的进程发来的 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 大神给出了问题解决的方式了!

请版主帮移到解决区,谢谢!我不知道那里移!

gyp2000 发表于 2021-3-19 02:14:19

f4李文杨 发表于 2021-3-18 20:55
楼上的几位大神帮忙看看!

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

afan 发表于 2021-3-18 09:09:14

本帖最后由 afan 于 2021-3-18 09:16 编辑

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

BTW, 标题错别字辣眼睛。

haijie1223 发表于 2021-3-18 18:26:58

我同意楼上的观点,并未看到其他程序是怎么发送的。
另外我记得,这个消息的函数得有返回值才会正常。

afan 发表于 2021-3-18 18:36:21

haijie1223 发表于 2021-3-18 18:26
我同意楼上的观点,并未看到其他程序是怎么发送的。
另外我记得,这个消息的函数得有返回值才会正常。

这个不需要返回值的

gyp2000 发表于 2021-3-18 19:05:33

需要完整代码,例子不可能就那么一个函数就能完成进程间通讯。至少要有窗体。而且这个是同步通讯,接收消息后需要立即返回。如果弹出对话框会导致发送端卡死。

f4李文杨 发表于 2021-3-18 20:55:25

楼上的几位大神帮忙看看!

gyp2000 发表于 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




f4李文杨 发表于 2021-3-20 09:35:44

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

非常感谢你的帮助,解决了我的问题!

afan 发表于 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');注册函数来接收 <<< 消息注册在上面发送之后?鬼才收得到……
页: [1]
查看完整版本: [已解决]怎么接收别的进程发来的 WM_COPYDATA 消息?