AutoHotkey-GDIp:从硬件加速窗口捕获屏幕截图

时间:2015-03-25 01:28:21

标签: screenshot gdi+ autohotkey bluestacks

我目前正在开发一个小脚本,它从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

要捕获的实际屏幕:

Manual Screenshot done with Alt+PrtScrn

我的脚本输出的实际文件: Black square, proper dimensions so it's seeing the right thing, but can't get the pixel data

关于如何访问帧缓冲区的任何想法或任何类型的指令也许?它不是以前没有人需要做的事情。

1 个答案:

答案 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,但是如果你的客户区域有固定的大小(大多数情况下),这样会更快 - 没有额外的计算。