如何使用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
相关产品推荐
相关产品推荐

