C# Имея дескриптор окна, как сделать снимок этого окна на windows XP (работает на windows 10) - PullRequest
0 голосов
/ 06 апреля 2020

У меня есть consoleapp, который делает скриншоты двух windows, принадлежащих стороннему программному обеспечению каждую секунду, чтобы создать историю. Консольное приложение было написано на компьютере с windows 10, где оно работает должным образом.

Проблема в том, что на целевой машине, на которой установлен windows xp, снимки экрана выполняются с рабочего стола, а не с этих windows.

Так как эти windows часто скрыты другими windows и находятся друг на друге, скриншот рабочего стола неправильный.

Существует способ заставить работать также на windows xp? Проект выполняется с использованием. net framework 4.0, поскольку на целевой машине установлен пакет обновления 2, и он не может использовать более обновленную платформу.

Вот код, который делает снимок экрана:

[DllImport("gdi32.dll", CharSet = CharSet.Auto, SetLastError = true, ExactSpelling = true)]
    private static extern int BitBlt(IntPtr hDC, int x, int y, int nWidth, int nHeight, IntPtr hSrcDC, int xSrc, int ySrc, int dwRop);

    public static Bitmap TakeScreenshot(IntPtr windowHandle, CopyPixelOperation copyPixelOperation = CopyPixelOperation.SourceCopy)
    {
        //this get the client rectangle of the window
        var rect = ClientRectangle(windowHandle);

        Bitmap bmp = new Bitmap(rect.Width, rect.Height);

        using (Graphics gdest = Graphics.FromImage(bmp))
        {
            using (Graphics gsrc = Graphics.FromHwnd(windowHandle))
            {
                IntPtr hSrcDC = gsrc.GetHdc();
                IntPtr hDC = gdest.GetHdc();
                BitBlt(hDC, 0, 0, rect.Width, rect.Height, hSrcDC, 0, 0, (int)copyPixelOperation);
                gdest.ReleaseHdc();
                gsrc.ReleaseHdc();
            }
        }

        return bmp;
    }
...