2

私は現在、BlueStacks のハードウェア アクセラレーション ウィンドウからスクリーンショットをキャプチャする小さなスクリプトに取り組んでいます。

問題は、ウィンドウをハードウェア アクセラレーションする必要があるように見えるため、スクリーン キャプチャで黒い四角形が保存されることです。

私はスクリプト作成に AutoHotkey を使用しており、GDI+ にアクセスするために GDIp ライブラリを追加しました。

問題は、ソフトウェアがフレームを 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

キャプチャする実際の画面:

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 に答える