AutoHotKey实现从一个脚本发送任何长度的字符串到另一个脚本
; 示例: 从一个脚本发送任何长度的字符串到另一个脚本. 这是个可运行的示例. ; 要使用它, 请保存并运行下面的脚本, 然后按下 Win+Space 来显示 ; InputBox 来让您输入字符串. ; 保存下面的脚本为 "Receiver.ahk", 然后运行它: #SingleInstance OnMessage(0x4a, "Receive_WM_COPYDATA") ; 0x4a 为 WM_COPYDATA return Receive_WM_COPYDATA(wParam, lParam) { StringAddress := NumGet(lParam + 2*A_PtrSize) ; 获取 CopyDataStruct 的 lpData 成员. CopyOfData := StrGet(StringAddress) ; 从结构中复制字符串. ; 比起 MsgBox, 应该用 ToolTip 显示, 这样我们可以及时返回: ToolTip %A_ScriptName%`nReceived the following string:`n%CopyOfData% return true ; 返回 1 (true) 是回复此消息的传统方式. }
; 保存下面的脚本为 "Sender.ahk", 接着运行它. 然后, 按下 Win+Space 热键. TargetScriptTitle = Receiver.ahk ahk_class AutoHotkey #space:: ; Win+Space 热键. 按下此热键会显示 InputBox 用于输入消息字符串. InputBox, StringToSend, Send text via WM_COPYDATA, Enter some text to Send: if ErrorLevel ; 用户按下了取消按钮. return result := Send_WM_COPYDATA(StringToSend, TargetScriptTitle) if result = FAIL MsgBox SendMessage failed. Does the following WinTitle exist?:`n%TargetScriptTitle% else if result = 0 MsgBox Message sent but the target window responded with 0, which may mean it ignored it. return Send_WM_COPYDATA(ByRef StringToSend, ByRef TargetScriptTitle) ; 在这种情况中使用 ByRef 能节约一些内存. ; 此函数发送指定的字符串到指定的窗口然后返回收到的回复. ; 如果目标窗口处理了消息则回复为 1, 而消息被忽略了则为 0. { VarSetCapacity(CopyDataStruct, 3*A_PtrSize, 0) ; 分配结构的内存区域. ; 首先设置结构的 cbData 成员为字符串的大小, 包括它的零终止符: SizeInBytes := (StrLen(StringToSend) + 1) * (A_IsUnicode ? 2 : 1) NumPut(SizeInBytes, CopyDataStruct, A_PtrSize) ; 操作系统要求这个需要完成. NumPut(&StringToSend, CopyDataStruct, 2*A_PtrSize) ; 设置 lpData 为到字符串自身的指针. Prev_DetectHiddenWindows := A_DetectHiddenWindows Prev_TitleMatchMode := A_TitleMatchMode DetectHiddenWindows On SetTitleMatchMode 2 TimeOutTime = 4000 ; Optional. Milliseconds to wait for response from receiver.ahk. Default is 5000 ; 必须使用发送 SendMessage 而不是投递 PostMessage. SendMessage, 0x4a, 0, &CopyDataStruct,, %TargetScriptTitle% ; 0x4a 为 WM_COPYDAT DetectHiddenWindows %Prev_DetectHiddenWindows% ; 恢复调用者原来的设置. SetTitleMatchMode %Prev_TitleMatchMode% ; 同样. return ErrorLevel ; 返回 SendMessage 的回复给我们的调用者. }
感谢分享
初入AHK,来跟大佬们学习。
老兄,这个能发送cmd 命令,到cmd窗口吗 ✗咧嘴笑✗