Попытка сделать снимок экрана игры, запущенной в BlueStacks с использованием C # - PullRequest
0 голосов
/ 16 октября 2019

Код работает нормально, если целевая игра работает в версии, установленной из Windows App Store. Игра представляет собой порт из игры для Android, и версия Windows больше не получает обновлений, поэтому я хочу запустить версию Android, более новую, с использованием BlueStacks на моем ПК.

Это код, который работает с родной 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, так как это «Engine», это не имеет никакого значения. Я также пытался использовать эмулятор MeMu, ноЯ получаю те же результаты.

Когда я проверяю цвет пикселя в точке x, y, где я хочу взаимодействовать с игрой, он показывает черный цвет вместо фактического зеленого цвета. Я нашел много других вопросов, которые получаличерные экраны возвращаются после аналогичных операций, не уверен, что здесь та же проблема.

Буду признателен за любуюпредложений, поскольку я много искал и пока не нашел ответа.

Обновлено, чтобы показать дочернее окно.

Вот что показывает Spy ++, "" _ctl.Window "BlueStacksApp"это окно, которое я ищу.

1 Ответ

0 голосов
/ 17 октября 2019

Если вы хотите сделать скриншот, я бы рекомендовал не изобретать все колесо снова. Вам, вероятно, стоит взглянуть на проект ShareX, который обладает теми же возможностями, что и вы.

Здесь - это проект ScreenCaptureLib (часть ShareX), предназначенный для снятия скриншота с экрана.

...