You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用AHK v1实现adb截图二进制输出重定向至文件?

在AHK中处理ADB二进制输出重定向的解决方案

方法一:通过CMD执行命令让系统处理重定向

AHK的RunWait本身对二进制输出的重定向支持有限,直接调用系统CMD来执行命令,让CMD处理文件重定向是最简单的方案:

; 隐藏CMD窗口执行命令,完成后自动关闭
RunWait, %ComSpec% /c "adb exec-out screencap -p > Screenshot.png",, Hide

%ComSpec%会自动指向系统的CMD路径,/c参数表示执行完命令后关闭CMD窗口,Hide用来隐藏执行过程中的CMD窗口。

方法二:直接捕获二进制输出并写入文件

如果需要在AHK中直接处理输出内容,可以通过Windows API创建管道,捕获ADB的二进制标准输出,再以二进制模式写入文件,避免文本编码转换导致的文件损坏:

; 清理旧文件和可能残留的ADB进程
FileDelete, Screenshot.png
Process, Close, adb.exe

; 创建管道用于捕获输出
hRead := 0, hWrite := 0
DllCall("CreatePipe", "Ptr*", hRead, "Ptr*", hWrite, "Ptr", 0, "UInt", 0)
DllCall("SetHandleInformation", "Ptr", hWrite, "UInt", 1, "UInt", 0)

; 配置进程启动信息,将输出导向管道
STARTUPINFO := A_PtrSize=8 ? 104 : 68
PROCESS_INFORMATION := A_PtrSize=8 ? 32 : 16
VarSetCapacity(si, STARTUPINFO, 0)
NumPut(STARTUPINFO, si, 0, "UInt")
NumPut(0x100, si, A_PtrSize=8 ? 64 : 44, "UInt") ; STARTF_USESTDHANDLES
NumPut(hWrite, si, A_PtrSize=8 ? 72 : 48, "Ptr") ; 绑定标准输出到管道
NumPut(hWrite, si, A_PtrSize=8 ? 80 : 52, "Ptr") ; 绑定标准错误到管道

VarSetCapacity(pi, PROCESS_INFORMATION, 0)
if !DllCall("CreateProcess", "Ptr", 0, "Str", "adb exec-out screencap -p", "Ptr", 0, "Ptr", 0, "Int", true, "UInt", 0x08000000, "Ptr", 0, "Ptr", 0, "Ptr", &si, "Ptr", &pi) {
    MsgBox, 启动ADB进程失败
    DllCall("CloseHandle", "Ptr", hRead)
    DllCall("CloseHandle", "Ptr", hWrite)
    return
}
DllCall("CloseHandle", "Ptr", hWrite)

; 读取管道内容并写入二进制文件
file := FileOpen("Screenshot.png", "wb")
if !file {
    MsgBox, 无法创建截图文件
    DllCall("CloseHandle", "Ptr", hRead)
    DllCall("CloseHandle", "Ptr", pi.hProcess)
    DllCall("CloseHandle", "Ptr", pi.hThread)
    return
}

VarSetCapacity(buffer, 4096, 0)
while DllCall("ReadFile", "Ptr", hRead, "Ptr", &buffer, "UInt", 4096, "UInt*", bytesRead, "Ptr", 0) && bytesRead {
    file.RawWrite(&buffer, bytesRead)
}
file.Close()

; 清理系统句柄
DllCall("CloseHandle", "Ptr", hRead)
DllCall("CloseHandle", "Ptr", pi.hProcess)
DllCall("CloseHandle", "Ptr", pi.hThread)
MsgBox, 截图已保存为Screenshot.png

方法三:用StdoutToVar库处理二进制输出

如果你已经在使用StdoutToVar库,只需指定二进制模式读取输出,再写入文件即可:

#include StdoutToVar.ahk

; 以二进制模式捕获输出(CP0表示不做编码转换)
StdoutToVar("adb exec-out screencap -p", output, "CP0")

; 将捕获的二进制内容写入文件
file := FileOpen("Screenshot.png", "wb")
file.RawWrite(&output, StrLen(output))
file.Close()

内容的提问来源于stack exchange,提问作者hoytdj

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 17:25:56