以前的即时消息是通过HTTP GET请求获取消息,今天来讲一下通过易语言WM_COPYDATA窗口消息获取即时消息。(正试版接口,没有更新的来找我)
首先打开Config.ini配置文件,修改两个配置:
WindowTitle属性为你DEMO的主窗口标题,接口将通过这个标题查找窗口句柄来发消息。
SendMessageMode=1为WM_COPYDATA消息模式,当为0时是HTTP GEP请求模式。
由于接口是vc++开发的,消息的内容为结构体,下面来看一下即时消息的结构体:
有了这个结构体,我们在易语言中就可以转换数据。
在易语言中,先定义消息常量
.版本 2
.常量 GWL_WNDPROC, "-4"
.常量 WM_COPYDATA, "74", , 0x4A
再获取窗口句柄
ApphWnd = 窗口_聊天窗口.取窗口句柄 ()
绑定窗口消息回调
.版本 2
OldProc = _GetWindowLong (ApphWnd, #GWL_WNDPROC)
_SetWindowLong (ApphWnd, #GWL_WNDPROC, 到整数 (&窗口消息回调))
再大消息中解析数据结构:
.版本 2
.子程序 窗口消息回调, 整数型, , TKMONITOR
.参数 hWnd, 整数型
.参数 uMsg, 整数型
.参数 wParam, 整数型
.参数 lParam, 整数型
.局部变量 dwRet, 整数型
.局部变量 lpCopy, COPYDATASTRUCT
.局部变量 sByte, 字节集
.局部变量 Str, 文本型
.局部变量 聊天消息, 字节集
.局部变量 聊天内容, 文本型
.判断开始 (uMsg = #WM_COPYDATA)
sByte = 指针到字节集 (lParam, 1024)
' 操作指令ID
lpCopy.dwData = 取字节集数据 (sByte, #整数型, 1)
' COPYDATA消息数据长度
lpCopy.cbData = 取字节集数据 (sByte, #整数型, 5)
' COPYDATA消息数据结构指针
lpCopy.lpData = 取字节集数据 (sByte, #整数型, 9)
' 判断是否为消息指令
.判断开始 (lpCopy.dwData = 7)
' 获取聊天消息二进制数据
聊天消息 = 指针到字节集 (lpCopy.lpData, lpCopy.cbData)
' 获取各个数据结构值
聊天内容 = 取字节集数据 (聊天消息, #文本型, 1)
' 输出聊天内容
聊天内容 = 编码_utf8到gb2312 (聊天内容)
编辑框_聊天内容.加入文本 (聊天内容 + #换行符 + #换行符)
.默认
.判断结束
dwRet = 0
.默认
dwRet = _CallWindowProc (OldProc, hWnd, uMsg, wParam, lParam)
.判断结束
返回 (dwRet)
下面是源码
.版本 2
.程序集 窗口_聊天窗口
.程序集变量 ApphWnd, 整数型
.程序集变量 OldProc, 整数型
.子程序 _窗口_聊天窗口_创建完毕
ApphWnd = 窗口_聊天窗口.取窗口句柄 ()
OldProc = _GetWindowLong (ApphWnd, #GWL_WNDPROC)
_SetWindowLong (ApphWnd, #GWL_WNDPROC, 到整数 (&窗口消息回调))
.子程序 _窗口_聊天窗口_将被销毁
_SetWindowLong (ApphWnd, #GWL_WNDPROC, OldProc)
.子程序 窗口消息回调, 整数型, , TKMONITOR
.参数 hWnd, 整数型
.参数 uMsg, 整数型
.参数 wParam, 整数型
.参数 lParam, 整数型
.局部变量 dwRet, 整数型
.局部变量 lpCopy, COPYDATASTRUCT
.局部变量 sByte, 字节集
.局部变量 Str, 文本型
.局部变量 聊天消息, 字节集
.局部变量 聊天内容, 文本型
.判断开始 (uMsg = #WM_COPYDATA)
sByte = 指针到字节集 (lParam, 1024)
' 操作指令ID
lpCopy.dwData = 取字节集数据 (sByte, #整数型, 1)
' COPYDATA消息数据长度
lpCopy.cbData = 取字节集数据 (sByte, #整数型, 5)
' COPYDATA消息数据结构指针
lpCopy.lpData = 取字节集数据 (sByte, #整数型, 9)
' 判断是否为消息指令
.判断开始 (lpCopy.dwData = 7)
' 获取聊天消息二进制数据
聊天消息 = 指针到字节集 (lpCopy.lpData, lpCopy.cbData)
聊天内容 = 取字节集数据 (聊天消息, #文本型, 1)
' 输出聊天内容
聊天内容 = 编码_utf8到gb2312 (聊天内容)
编辑框_聊天内容.加入文本 (聊天内容 + #换行符 + #换行符)
.默认
.判断结束
dwRet = 0
.默认
dwRet = _CallWindowProc (OldProc, hWnd, uMsg, wParam, lParam)
.判断结束
返回 (dwRet)
.子程序 _窗口_聊天窗口_尺寸被改变
编辑框_聊天内容.移动 (编辑框_聊天内容.左边, 编辑框_聊天内容.顶边, 窗口_聊天窗口.宽度 - 编辑框_聊天内容.左边 - 8, 窗口_聊天窗口.高度 - 编辑框_聊天内容.顶边 - 33)
调试结果:
源码放群里面了 交流扣扣群 1005923608 150311852