首页 > 解决方案 > 尝试使用 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 处检查我想与游戏交互的像素颜色时,它显示为黑色,而不是实际的绿色。我发现许多其他问题都是从类似的操作中返回的黑屏,不确定这里是否是同样的问题。

我会很感激任何建议,因为我已经搜索了很多但还没有找到答案。

更新为显示子窗口。

这是 Spy++ 显示的内容,""_ctl.Window" BlueStacksApp" 是我想要的窗口。

标签: c#androidbluestacks

解决方案


Use SecondBSWin handle instead of ForthBSWin handle


推荐阅读