c# - 尝试使用 C# 截取在 BlueStacks 中运行的游戏的屏幕截图
问题描述
当目标游戏在从 Windows App Store 安装的版本上运行时,代码可以正常工作。该游戏是 Android 游戏的一个端口,Windows 版本不再接收更新,所以我想在我的 PC 上使用 BlueStacks 运行更新的 Android 版本。
这是适用于本机 Windows 版本游戏的代码。
public GameWindow(int titleHeight)
{
GetGameWindow();
TitleHeight = titleHeight;
}
private void GetGameWindow()
{
Form1.Rect rectangle = default(Form1.Rect);
IntPtr intPtr = FindWindow("ApplicationFrameWindow", "Game Window");
SetForegroundWindow(intPtr);
GetWindowRect(intPtr, ref rectangle);
top = rectangle.Top;
left = rectangle.Left;
width = rectangle.Right - rectangle.Left;
height = rectangle.Bottom - rectangle.Top;
UIClass.ClickBar(this);
}
public void BringToFront()
{
IntPtr foregroundWindow = FindWindow("ApplicationFrameWindow", "Game Window");
SetForegroundWindow(foregroundWindow);
}
public Bitmap Capture()
{
Bitmap bitmap = new Bitmap(Width, Height);
Rectangle rectangle = new Rectangle(Left, Top, width, height);
using (Graphics graphics = Graphics.FromImage(bitmap))
{
graphics.CopyFromScreen(new Point(rectangle.Left, rectangle.Top), Point.Empty, rectangle.Size);
}
return bitmap;
}
public void Capture(string path)
{
Bitmap bitmap = new Bitmap(Width, Height);
Rectangle rectangle = new Rectangle(Left, Top, width, height);
using (Graphics graphics = Graphics.FromImage(bitmap))
{
graphics.CopyFromScreen(new Point(rectangle.Left, rectangle.Top), Point.Empty, rectangle.Size);
}
bitmap.Save(Path.Combine(path, "UT" + DateTime.Now.Ticks.ToString() + ".jpg"));
bitmap.Dispose();
}
}
}
这就是我试图深入到子窗口的内容”
public GameWindow(int titleHeight)
{
GetGameWindow();
TitleHeight = titleHeight;
}
private void GetGameWindow()
{
Form1.Rect rectangle = default(Form1.Rect);
IntPtr intPtr = FindWindow("HwndWrapper[Bluestacks.exe;;310d8add-fc43-4c3e-a64b-2cd5f6d0618c]", "BlueStacks");
SecondBSWin = FindWindowEx(intPtr, IntPtr.Zero, "WindowsForms10.Window.8.app.0.34f5582_r6_ad1", "BlueStacks Android PluginAndroid");
ThirdBSWin = FindWindowEx(SecondBSWin, IntPtr.Zero, "WindowsForms10.EDIT.app.0.34f5582_r6_ad1", null);
ForthBSWin = FindWindowEx(ThirdBSWin, IntPtr.Zero, "BlueStacksApp", "_ctl.Window");
SetForegroundWindow(ForthBSWin);
GetWindowRect(ForthBSWin, ref rectangle);
top = rectangle.Top;
left = rectangle.Left;
width = rectangle.Right - rectangle.Left;
height = rectangle.Bottom - rectangle.Top;
UIClass.ClickBar(this);
}
public void BringToFront()
{
IntPtr foregroundWindow = FindWindow("HwndWrapper[Bluestacks.exe;;edc30241-e5fe-4f1b-a9ae-8fcca64ba7b9]", "BlueStacks");
SetForegroundWindow(foregroundWindow);
SecondBSWin = FindWindowEx(foregroundWindow, IntPtr.Zero, "WindowsForms10.Window.8.app.0.34f5582_r6_ad1", "BlueStacks Android PluginAndroid");
ThirdBSWin = FindWindowEx(SecondBSWin, IntPtr.Zero, "WindowsForms10.EDIT.app.0.34f5582_r6_ad1", null);
ForthBSWin = FindWindowEx(ThirdBSWin, IntPtr.Zero, "BlueStacksApp", "_ctl.Window");
}
public Bitmap Capture()
{
Bitmap bitmap = new Bitmap(Width, Height);
Rectangle rectangle = new Rectangle(Left, Top, width, height);
using (Graphics graphics = Graphics.FromImage(bitmap))
{
graphics.CopyFromScreen(new Point(rectangle.Left, rectangle.Top), Point.Empty, rectangle.Size);
}
return bitmap;
}
public void Capture(string path)
{
Bitmap bitmap = new Bitmap(Width, Height);
Rectangle rectangle = new Rectangle(Left, Top, width, height);
using (Graphics graphics = Graphics.FromImage(bitmap))
{
graphics.CopyFromScreen(new Point(rectangle.Left, rectangle.Top), Point.Empty, rectangle.Size);
}
bitmap.Save(Path.Combine(path, "UT" + DateTime.Now.Ticks.ToString() + ".jpg"));
bitmap.Dispose();
}
}
}
整个项目在本机 Windows 版本上运行良好,到目前为止我所做的只是调整程序以使用它所做的 BlueStacks 窗口。我可以将 BlueStacks 模拟器设置为使用 OpenGL 或 DircetX,因为它是“引擎”,根本没有区别。我也尝试过使用 MeMu 模拟器,但我得到了相同的结果。
当我在 x、y 处检查我想与游戏交互的像素颜色时,它显示为黑色,而不是实际的绿色。我发现许多其他问题都是从类似的操作中返回的黑屏,不确定这里是否是同样的问题。
我会很感激任何建议,因为我已经搜索了很多但还没有找到答案。
更新为显示子窗口。
解决方案
Use SecondBSWin handle instead of ForthBSWin handle