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
}

 

声明:站内资源为整理优化好的代码上传分享与学习研究,如果是开源代码基本都会标明出处,方便大家扩展学习路径。请不要恶意搬运,破坏站长辛苦整理维护的劳动成果。本站为爱好者分享站点,所有内容不作为商业行为。如若本站上传内容侵犯了原著者的合法权益,请联系我们进行删除下架。