V1发送与接收端.ahk
#Requires AutoHotkey v1.1.33+ /* 以下是一个简易的V1与V2通信的测试,通信后互相调用解决一些“兼容”问题 大致原理是V2给V1发信息%CopyOfData% V1接到信息后拆解,前9个字符是标签名,后面是自定义,可以是坐标,也可以是其它数据等等 一些用法: 也可以用V2新建V1的进程,创建FindText找图,找到图后再返回给V2坐标数据等等一类操作 */ #SingleInstance Force ; AHK脚本以管理员权限自启 if !A_IsAdmin && !RegExMatch(_:=DllCall("GetCommandLine", "Str"), " /restart(?!\S)") RunWait % "*RunAs " RegExReplace(_, "^\"".*?\""\K|^\S*\K", " /restart") OnMessage(0x4a, "Receive_WM_COPYDATA") TargetScriptTitle := "V2发送与接收端.ahk ahk_class AutoHotkey" F1:: InputBox, StringToSend, V1发送端,发送文本 WM_COPYDATA, V1发送端,输入要发送的文字:,,,,,,,, 不熟V2语法,只能给V2发文字… if ErrorLevel return result := Send_WM_COPYDATA(StringToSend, TargetScriptTitle) if (result = "FAIL") MsgBox SendMessage失败或超时,设置的标题名是否存在?`n或者是等待超时?`n%TargetScriptTitle% else if (result = 0) MsgBox 发送消息,但目标窗口响应0, 这可能意味着被忽略了。 return BiaoQianA: SetTimer, ClearToolTip, -3000 CoordMode, Mouse, Screen ExecX := SubStr(CopyOfData, 10, 4) ExecY := SubStr(CopyOfData, -3) MouseMove, ExecX, ExecY Send_WM_COPYDATA("小弟已经完成鼠标位移,特来汇报", TargetScriptTitle) return BiaoQianB: SetTimer, ClearToolTip, -3000 MsgBox, 0, 请5秒内关闭,避免发送端等待反馈超时, % SubStr(CopyOfData, 10) Send_WM_COPYDATA("大哥的命令,小弟已收到", TargetScriptTitle) return ClearToolTip: ToolTip Return ; 接收函数 Receive_WM_COPYDATA(wParam, lParam) { StringAddress := NumGet(lParam + 2*A_PtrSize) Global CopyOfData := StrGet(StringAddress) ToolTip V1接收端`n收到以下字符串:`n%CopyOfData% ExecLabel := SubStr(CopyOfData, 1, 9) if IsLabel(ExecLabel) Gosub, %ExecLabel% return true } ; 发送函数 Send_WM_COPYDATA(ByRef StringToSend, ByRef TargetScriptTitle) { VarSetCapacity(CopyDataStruct, 3*A_PtrSize, 0) SizeInBytes := (StrLen(StringToSend) + 1) * (A_IsUnicode ? 2 : 1) NumPut(SizeInBytes, CopyDataStruct, A_PtrSize) NumPut(&StringToSend, CopyDataStruct, 2*A_PtrSize) DetectHiddenWindows On SetTitleMatchMode 2 SendMessage, 0x4a, 0, &CopyDataStruct,, %TargetScriptTitle% return ErrorLevel }
V2发送与接收端.ahk2
#Requires AutoHotkey v2.0 /* 以下是一个简易的V1与V2通信的测试,通信后互相调用解决一些“兼容”问题 大致原理是V2给V1发信息%CopyOfData% V1接到信息后拆解,前9个字符是标签名,后面是自定义,可以是坐标,也可以是其它数据等等 一些用法: 也可以用V2新建V1的进程,创建FindText找图,找到图后再返回给V2坐标数据等等一类操作 */ #SingleInstance Force ; AHKv2的脚本以管理员权限自启【旧版】 By Tebayaki if !A_IsAdmin && !(DllCall("GetCommandLine", "str") ~= " /restart(?!\S)") Try RunWait('*RunAs "' (A_IsCompiled ? A_ScriptFullPath '" /restart' : A_AhkPath '" /restart "' A_ScriptFullPath '"')) OnMessage 0x004A, Receive_WM_COPYDATA TargetScriptTitle := "V1发送与接收端.ahk ahk_class AutoHotkey" F2:: { ib := InputBox("输入要发送的文本:`n`n让V1给我端茶送水!`n让V1给我端茶送水!`n让V1给我端茶送水!", "V2发送端,发送文本到 WM_COPYDATA", ,"BiaoQianA0655,0300") if ib.Result = "Cancel" return result := Send_WM_COPYDATA(ib.Value, TargetScriptTitle) if result = "" MsgBox "SendMessage失败或超时,设置的标题名是否存在?`n或者是等待超时?`n" TargetScriptTitle else if (result = 0) MsgBox "发送消息,但目标窗口响应0, 这可能意味着被忽略了。" } ; 发送函数 Send_WM_COPYDATA(StringToSend, TargetScriptTitle) { CopyDataStruct := Buffer(3*A_PtrSize) SizeInBytes := (StrLen(StringToSend) + 1) * 2 NumPut( "Ptr", SizeInBytes , "Ptr", StrPtr(StringToSend) , CopyDataStruct, A_PtrSize) DetectHiddenWindows True SetTitleMatchMode 2 TimeOutTime := 5000 ; 可选的. 等待 接收端.ahk 响应的毫秒数,按自己的需求延长等待时间 RetValue := SendMessage(0x4a, 0, CopyDataStruct,, TargetScriptTitle,,,, TimeOutTime) return RetValue } ; 接收函数 Receive_WM_COPYDATA(wParam, lParam, msg, hwnd) { StringAddress := NumGet(lParam, 2*A_PtrSize, "Ptr") CopyOfData := StrGet(StringAddress) ToolTip "V2接收端`n收到以下字符串:`n" CopyOfData SetTimer () => ToolTip(), -3000 return true }
声明:站内资源为整理优化好的代码上传分享与学习研究,如果是开源代码基本都会标明出处,方便大家扩展学习路径。请不要恶意搬运,破坏站长辛苦整理维护的劳动成果。本站为爱好者分享站点,所有内容不作为商业行为。如若本站上传内容侵犯了原著者的合法权益,请联系我们进行删除下架。
评论(0)