2

我目前正在编写一个小脚本,该脚本从 BlueStacks 中的硬件加速窗口捕获屏幕截图。

问题是,看起来窗口必须是硬件加速的,所以屏幕截图节省了一个黑色方块。

我正在使用 AutoHotkey 编写脚本,并添加了 GDIp 库以访问 GDI+。

我怀疑问题在于 GDIp 无法使用 PrintWindow 抓取数据,因为软件将帧直接推送到 GPU,但必须有一种方法来捕获此帧。

我的脚本:

#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

要捕获的实际屏幕:

使用 Alt+PrtScrn 完成的手动屏幕截图

我的脚本输出的实际文件: 黑色方块,尺寸合适,所以它看到了正确的东西,但无法获取像素数据

关于去哪里的任何想法或关于如何访问帧缓冲区的任何指令?这不可能是以前没有人需要做的事情。

4

1 回答 1

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,但是如果您的客户区具有固定大小(大多数情况下),这会更快 - 无需额外计算。

于 2015-03-25T18:26:09.370 回答