|
|
发表于 2019-7-21 00:13:54
|
显示全部楼层
3.本地插件dll可以获取当前群的窗口句柄,然后此dll可以根据需要向那个窗口(即那个群)发送文字。
c++或者易语言应该都可以调用windows的API函数
SendMessageA(hwnd1,1301,uin,tempstr);
第一个是窗口句柄,第二个是消息id,固定为1301,第三个参数是要向群里哪个qq发此消息(如果uin的值为99998888或88889999,则表示第四个参数是utf8格式,而且如果是88889999,则是类似于在qq群和好友列表那里发送群消息,不经过群输出替换等处理),如果只是发在群里,可以把此参数设置为0,如果要针对具体某个qq号发消息,就要在这个参数里传递此人的qq号。默认是在群里发此消息的,如果要跟那个qq号私聊,那么第四个参数必须以“私聊”二字开头。第四个参数是要发的文字(统一为ascii码格式,而非unicode或utf8格式),可以包含奖惩指令,如果不希望意外包含奖惩指令,也可以在末尾加一个“【过滤奖惩字符】”标识,防止别人钻什么漏洞。
其中第一个参数窗口句柄来自于插件dll之前被调用时获取到的传入的完整参数列表中的myhwnd参数。注意不是初始化dll时,而是每次在群里比如以【显示网址内容http://127.0.0.1/testplug.dll?function=splitfun&cmdstr=$回声$】被调用时就能获取到传入的myhwnd参数了。
使用这种方法就可以利用插件主动向群里或者群友发消息、发通知了。而不用使用之前的定时任务之类低效的方式。
4.机器人启动后还会在软件目录下生成一个“群号和窗口句柄对应关系.txt”,这样除了制作本地dll插件可以跟机器人通讯外,甚至还可以通过其它exe解析“群号和窗口句柄对应关系.txt”文件,然后跨进程向机器人窗口发文本数据来主动向群里发消息。
注意如果是跨进程向机器人窗口发消息时,必须使用
SendMessageA(hwnd1,WM_COPYDATA,0,cpd);其中第一个参数还是窗口句柄,第二个是windows专用的跨进程通讯的消息消息id 74,第三个无意义,可设置为0,第四个是一个指向COPYDATASTRUCT的地址或者说指针。要实现的话,大家可以自行在网上搜索“WM_COPYDATA 易语言”或者“易语言WM_COPYDATA消息通信”之类教程。
如果要以某个qq为发消息对象,则第四个参数cpd指向的utf8格式的文本的开头应该包含一个“13402429groupnum:208597416 ”之类的标识。前面的13402429是qq号,后面的208597416是群号。如果没加这些,则是单纯的在群里发消息,而没指定是向谁回复消息。记得确保群号后面有一个空格,以免跟后面消息正文中的数字粘连在一起了。具体消息是以私聊的方式显示消息还是默认的在群里显示,也同样是取决于是否在消息正文的开头是否有“私聊”二字。 |
|