Как извлечь Bitmap свернутого процесса в Windows?

Я извлекаю Bitmap процесса следующим кодом:

*Код*

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.InteropServices;
using System.Diagnostics;

namespace ConsoleApplication8
{
    public static class ProcessPictureGetter
    {
        [StructLayout(LayoutKind.Sequential)]
        public struct RECT
        {
            public int Left;
            public int Top;
            public int Right;
            public int Bottom;
        }

        public static void SaveProcessPicture(string processName, string savePath)
        {
            Bitmap savedProcessPicture = GetProcessPicture(processName);
            savedProcessPicture.Save(savePath, System.Drawing.Imaging.ImageFormat.Png);
            savedProcessPicture.Dispose();
        }

        public static Bitmap GetProcessPicture(string processName)
        {
            IntPtr hDesk = FindWindow(null, processName);
            RECT rct;
            GetWindowRect(hDesk, out rct);
            Size sz = new System.Drawing.Size(rct.Right - rct.Left + 1, rct.Bottom - rct.Top + 1);

            IntPtr hSrce = GetWindowDC(hDesk);
            IntPtr hDest = CreateCompatibleDC(hSrce);
            IntPtr hBmp = CreateCompatibleBitmap(hSrce, sz.Width, sz.Height);
            IntPtr hOldBmp = SelectObject(hDest, hBmp);
            bool b = BitBlt(hDest, 0, 0, sz.Width, sz.Height, hSrce, 0, 0, CopyPixelOperation.SourceCopy | CopyPixelOperation.CaptureBlt);
            Bitmap bmp = Bitmap.FromHbitmap(hBmp);
            SelectObject(hDest, hOldBmp);
            DeleteObject(hBmp);
            DeleteDC(hDest);
            ReleaseDC(hDesk, hSrce);

            return bmp;

        }

        // P/Invoke declarations
        [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
        static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
        [return: MarshalAs(UnmanagedType.Bool)]
        [DllImport("user32.dll", SetLastError = true)]
        public static extern bool GetWindowRect(IntPtr hwnd, out RECT lpRect);

        [DllImport("gdi32.dll")]
        public static extern bool BitBlt(IntPtr hdcDest, int xDest, int yDest, int
        wDest, int hDest, IntPtr hdcSource, int xSrc, int ySrc, CopyPixelOperation rop);
        [DllImport("user32.dll")]
        public static extern bool ReleaseDC(IntPtr hWnd, IntPtr hDc);
        [DllImport("gdi32.dll")]
        public static extern IntPtr DeleteDC(IntPtr hDc);
        [DllImport("gdi32.dll")]
        public static extern IntPtr DeleteObject(IntPtr hDc);
        [DllImport("gdi32.dll")]
        public static extern IntPtr CreateCompatibleBitmap(IntPtr hdc, int nWidth, int nHeight);
        [DllImport("gdi32.dll")]
        public static extern IntPtr CreateCompatibleDC(IntPtr hdc);
        [DllImport("gdi32.dll")]
        public static extern IntPtr SelectObject(IntPtr hdc, IntPtr bmp);
        [DllImport("user32.dll")]
        public static extern IntPtr GetDesktopWindow();
        [DllImport("user32.dll")]
        public static extern IntPtr GetWindowDC(IntPtr ptr);
        [DllImport("user32.dll", SetLastError = true)]
        public static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint processId);
    }
}



И это не работает для свёрнутых окон и Chrome, вместо них просто черные прямоугольники. Можно ли как-то получить Bitmap процесса независимо от его свернутости?
  • Вопрос задан
  • 132 просмотра
Решения вопроса 1
HemulGM
@HemulGM Куратор тега Windows
Delphi Developer, сис. админ
Нет. При чем, процесс тут не при чем. Ты получаешь скрин окон, а не процесса
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
vabka
@vabka Куратор тега C#
Токсичный шарпист
Раз вы скриншотите Chrome, то могу предложить использовать для этого selenium/pupeter/playwright- они позволяют запустить хром без окна и делать скриншоты страниц
Ответ написан
Комментировать
BasiC2k
@BasiC2k
.NET developer (open to job offers)
Сделайте окно видимым, заскриншотьте и скройте. За доли секунды пользователь ничего не заметит.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы