我目前正在开发一个小脚本,它从BlueStacks中的硬件加速窗口捕获屏幕截图。
问题是,看起来窗口必须是硬件加速的,因此屏幕截图正在保存黑色方块。
我正在使用AutoHotkey编写脚本,并添加了GDIp库以访问GDI +。
我怀疑问题是由于软件将帧直接推送到GPU,GDIp无法使用PrintWindow获取数据,但必须有一种方法来捕获此帧。
我的剧本:
#SingleInstance, Force
#NoEnv
SetBatchLines, -1
OnExit, Exit
#Include Gdip.ahk
#Include GDIpHelper.ahk
SetUpGDIP()
WinGet, hwnd, ID, BlueStacks App Player
pBitmap := Gdip_BitmapFromHWND(hwnd)
Gdip_SaveBitmapToFile(pBitmap, "TestOutput.png", 100)
Gdip_DisposeImage(pBitmap)
return
要捕获的实际屏幕:
我的脚本输出的实际文件:
关于如何访问帧缓冲区的任何想法或任何类型的指令也许?它不是以前没有人需要做的事情。
答案 0 :(得分:1)
我也在寻找解决方案。无论如何,我用另一种方式写了它:
pToken := Gdip_Startup()
winName := "BlueStacks App Player"
clientW := 868 ; set your client area width
clientH := 720 ; set your client area height
WinGetPos, x, y, w, h, %winName%
winBorder := (w-clientW)/2
x := x+winBorder
y := y+(h-clientH-winBorder)
snap := Gdip_BitmapFromScreen(x "|" y "|" clientW "|" clientH)
Gdip_SaveBitmapToFile(snap, "snap.png")
Gdip_DisposeImage(snap)
Gdip_ShutDown(pToken)
它不优雅但有效。 可能有一种简单的方法可以自动设置clientW和clientH,但是如果你的客户区域有固定的大小(大多数情况下),这样会更快 - 没有额外的计算。