精易论坛

标题: 利用API#PostMessage的进程通信模块 [打印本页]

作者: Peanut    时间: 2019-1-4 20:42
标题: 利用API#PostMessage的进程通信模块
本帖最后由 Peanut 于 2019-1-5 00:41 编辑

思路如下

发送:
1.将文本型的消息内容拆分成字节集类型
2.先取出字节集长度,使用PostMessage这个API发送给指定窗口
3.然后进行循环,一个一个字节的发给(也是使用PostMessage这个API)指定窗口

接收:
1.使用SetWindowLong为改窗口设置新的过程函数(就是窗口收到消息之后,我们的这个函数会先处理消息)
2.判断消息标识是不是我们设定的,如果是的话,进行相应处理。(一个一个的接收字节集,直到字节集长度等于一开始收到的指定长度)
3.一个一个字节集收到之后,将字节集转为文本型,调用我们设置的回调函数,把这个文本型数据当参数传送
4.最后使用CallWindowProc这个API,调用程序原来的消息处理函数(因为有的消息是程序本身的,比如点击一个按钮之类的,所以要把收到的消息传给程序用来的消息函数)

保证消息标识的唯一性是用RegisterWindowMessage这个API处理的,理论上可以实现一个程序和多个程序的通信。

程序本身也可以向自己发消息,这个方法的缺点显然易见,当数据量很大的时候,就显得效率太低了(一个字节一个字节发)。但是相比SendMessage,在大多数的时候,他比较稳定。
总而言之,发一些几十个字或者几百个字的文本型数据,应该是完全够用。需要的话,可以自己改成字节集等其它变量类型的通信



也是最近做一个项目用到的,不知道论坛有没有相似的功能模块。如果有的话,就当是经验分享了
另外,有朋友发现这种方式的缺陷的话,也麻烦说一下。大家共同进步



作者: ManNanIsMe    时间: 2019-1-4 22:20
卧槽   卧槽   我刚刚还在研究这个函数呢~  卧槽 卧槽
作者: 福仔    时间: 2019-1-4 22:41
其实可以改成传地址过去,然后让另一个程序读这个地址的内容
不过postmessage的话传变量地址不是很理想,只能自己申请内存,写入数据,在传过去
作者: Peanut    时间: 2019-1-5 00:38
福仔 发表于 2019-1-4 22:41
其实可以改成传地址过去,然后让另一个程序读这个地址的内容
不过postmessage的话传变量地址不是很理想,只 ...

数据写到内存的话,可以远线程申请内存,然后远线程调用程序里面的一个子函数,但是感觉涉及内存可能就麻烦了。怕程序崩溃,所以用这种笨方法
作者: longsui48    时间: 2019-1-5 10:01
两开花?你这是要谢罪的
作者: 2161045897    时间: 2019-1-6 13:55
感谢分享~~~
作者: zytlj    时间: 2019-1-6 18:16
谢谢楼主分享,下来学习一下

作者: 火狐编程    时间: 2019-1-6 18:17
学习下,不错。。。

作者: 那厮休得无礼    时间: 2019-1-7 12:17
学习了........
作者: 网络注册会员    时间: 2019-1-7 14:32
真的不错的
作者: sinewtec    时间: 2019-1-8 15:20
看看实现的效果如何


作者: ΒΜΧ    时间: 2019-1-10 16:08
有什么鸟用

作者: 晓之霖葬    时间: 2019-2-4 01:37
没啥用,我还试过远程代码来子类化游戏窗口,回调就申请一个地址写一段处理代码,每当我发送一个send消息过去,就会自动执行代码
作者: 陈鹏舜    时间: 2019-6-22 17:45
试了不能正常执行
作者: yj123123    时间: 2019-10-25 21:32
9999999999999999
作者: 杨明煜    时间: 2019-12-19 20:44
有深度............
作者: 2161045897    时间: 2020-4-21 21:46
感谢分享~~~~~~~~~~
作者: 850536360    时间: 2020-5-29 09:52
SetWindowLongSetWindowLong
作者: ymg1158    时间: 2020-11-7 20:24
精益模块就有这命令

作者: zhongzutao    时间: 2022-3-7 09:34
感谢分享
作者: zkwt0012    时间: 2022-3-31 08:42
SetWindowLongSetWindowLong
作者: 381432753    时间: 2022-5-12 13:28
笑嘻嘻笑嘻嘻笑嘻嘻笑嘻嘻笑嘻嘻笑嘻嘻笑嘻嘻笑嘻嘻系
作者: gay酱    时间: 2022-8-6 20:38
支持支持支持支持支持支持支持支持支持支持
作者: 摸鱼鸽子    时间: 2022-8-6 22:43
大佬66666666
作者: gskj999    时间: 2022-8-10 08:24
思路如下

发送:
1.将文本型的消息内容拆分成字节集类型
2.先取出字节集长度,使用PostMessage这个API发送给指定窗口
3.然后进行循环,一个一个字节的发给(也是使用PostMessage这个API)指定窗口
作者: gskj999    时间: 2022-8-10 08:25
接收:
1.使用SetWindowLong为改窗口设置新的过程函数(就是窗口收到消息之后,我们的这个函数会先处理消息)
2.判断消息标识是不是我们设定的,如果是的话,进行相应处理。(一个一个的接收字节集,直到字节集长度等于一开始收到的指定长度)
3.一个一个字节集收到之后,将字节集转为文本型,调用我们设置的回调函数,把这个文本型数据当参数传送
4.最后使用CallWindowProc这个API,调用程序原来的消息处理函数(因为有的消息是程序本身的,比如点击一个按钮之类的,所以要把收到的消息传给程序用来的消息函数)

保证消息标识的唯一性是用RegisterWindowMessage这个API处理的,理论上可以实现一个程序和多个程序的通信。

程序本身也可以向自己发消息,这个方法的缺点显然易见,当数据量很大的时候,就显得效率太低了(一个字节一个字节发)。但是相比SendMessage,在大多数的时候,他比较稳定。
总而言之,发一些几十个字或者几百个字的文本型数据,应该是完全够用。需要的话,可以自己改成字节集等其它变量类型的通信
作者: wnorrisw    时间: 2022-10-5 22:02
111111111111
作者: 3717    时间: 2023-5-10 11:46
        感谢分享,很给力
作者: chis777780    时间: 2024-3-5 13:03
感谢分享,很给力!~
作者: capture02    时间: 2024-4-5 13:38
感谢分享,很给力!~
作者: hquhdg    时间: 2024-6-24 15:03
好用 吗。。。。。。。。。。。。。。。
作者: yezirun888    时间: 2025-4-13 12:38
6666666666666666666666
作者: 哇哇哇厉害    时间: 2025-4-30 11:10
好东西人少系列!!!!!!!!
作者: caiyu268    时间: 2025-5-9 21:54
666666666666666666666666
作者: caiyu268    时间: 2025-5-9 21:55
感谢分享,很给力!~
作者: caiyu268    时间: 4 天前
666666666666
作者: caiyu268    时间: 4 天前
感谢分享,很给力!~
作者: ljx111    时间: 4 天前
感谢分享




欢迎光临 精易论坛 (https://125.confly.eu.org/) Powered by Discuz! X3.4