@andrejfomenko

Как сделать скриншот скрытой части экрана?

У меня программа работает через selenium webdriver firefox и просто запускает chrome с моим расширением.
Чтобы это все мне не мешало, я скрываю окна этих программ, для этого обращаюсь к методам:
class Viewer
    {
        public const int SW_HIDE = 0;
        public const int SW_SHOW = 5;
        public const int SW_Min = 2;
        public const int SW_Max = 3;
        public const int SW_Norm = 4;
        public const int WM_CLOSE = 0x10;


        [DllImport("kernel32.dll")]
        public static extern IntPtr GetConsoleWindow();

        [DllImport("user32.dll")]
        public static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);

        [DllImport("user32.dll")]
        public static extern int FindWindow(string ClassName, string WindowsName);
        [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)]
        public static extern IntPtr SendMessage(IntPtr handle, UInt32 message, IntPtr w, IntPtr l);        
        public static void CloseWindow(IntPtr handle)
        {
            SendMessage(handle, WM_CLOSE, IntPtr.Zero, IntPtr.Zero);
        }
    }

По итогу использую SW_Hide и SW_Show.
В selenium webdriver если я скрываю браузер firefox таким образом:
driver = new FirefoxDriver(ffds, opt);
            wname = Viewer.FindWindow("MozillaWindowClass", "Mozilla Firefox");
            IntPtr hh = new IntPtr(wname);
            Viewer.ShowWindow(hh, Viewer.SW_HIDE);

То скрин скрытого браузера можно получить за счет библиотеки Selenium:
Screenshot screen = driver.GetScreenshot();
                    screen.SaveAsFile(@"D:\logs\screen.jpg", ScreenshotImageFormat.Jpeg)

Вопрос как получить скриншот браузера Хроме, если я его скрыл и он запущен просто как процесс?
Process proc = new Process();
                proc.StartInfo.FileName ="chrome.exe";
                proc.Start();
int wname = Viewer.FindWindow("Chrome_WidgetWin_1", "Новая вкладка - Google Chrome");
IntPtr name = new IntPtr(wname)
Viewer.ShowWindow(name, Viewer.SW_SHOW);

Нашел и добавил в свой класс Viewer:
[DllImport("user32.dll", SetLastError = true)]
        public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

        [DllImport("User32.dll", SetLastError = true)]
        [return: MarshalAs(UnmanagedType.Bool)]
        public static extern bool PrintWindow(IntPtr hwnd, IntPtr hDC, uint nFlags);

        [DllImport("user32.dll")]
        public static extern bool GetWindowRect(IntPtr handle, ref Rectangle rect);


        public static void CaptureWindow(IntPtr handle)
        {
            // Get the size of the window to capture
            Rectangle rect = new Rectangle();
            GetWindowRect(handle, ref rect);

            // GetWindowRect returns Top/Left and Bottom/Right, so fix it
            rect.Width = rect.Width - rect.X;
            rect.Height = rect.Height - rect.Y;

            // Create a bitmap to draw the capture into
            using (Bitmap bitmap = new Bitmap(rect.Width, rect.Height))
            {
                // Use PrintWindow to draw the window into our bitmap
                using (Graphics g = Graphics.FromImage(bitmap))
                {
                    IntPtr hdc = g.GetHdc();
                    if (!PrintWindow(handle, hdc, 0))
                    {
                        int error = Marshal.GetLastWin32Error();
                        var exception = new System.ComponentModel.Win32Exception(error);
                        Debug.WriteLine("ERROR: " + error + ": " + exception.Message);
                        // TODO: Throw the exception?
                    }
                    g.ReleaseHdc(hdc);
                }

                // Save it as a .png just to demo this
                bitmap.Save(@"D:\logs\screen.png");
            }
        }

По клику на кнопку добавил кодец:
private void button8_Click(object sender, EventArgs e)
        {
            Thread tr10 = new Thread(() =>
            {
                IntPtr hwnd = new IntPtr(Wiq.wname);
                Viewer.CaptureWindow(hwnd);
            });
            tr10.Start();
        }

Но создается изображение просто черный квадрат))
  • Вопрос задан
  • 203 просмотра
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы