Как захватить окно Unity из своего приложения на c#?

В своем приложении хочу захватить скрин стороннего приложения, сделанного на Unity. Использовал функции PrintWindow

internal static void GetImagePrintWindow(string windowTitle)
    {
        IntPtr handler = FindWindow(null, windowTitle);
        RECT rect;
        MessageBox.Show(GetWindowRect(handler, out rect).ToString());
        using (Bitmap bitmap = new Bitmap(rect.Right - rect.Left, rect.Bottom - rect.Top))
        {
            using (Graphics g = Graphics.FromImage(bitmap))
            {
                IntPtr hdc = g.GetHdc();
                if (!PrintWindow(handler, hdc, 0))
                {
                    int error = Marshal.GetLastWin32Error();
                    var exception = new System.ComponentModel.Win32Exception(error);
                    MessageBox.Show("ERROR: " + error + ": " + exception.Message);                        
                }
                g.ReleaseHdc(hdc);
            }
            bitmap.Save("Example.png");
            bitmap.Dispose();               
        }
    }

И BitBlt

internal static void GetImageBitBlt(string windowTitle)
    {
        IntPtr handler = FindWindow(null, windowTitle);
        RECT rect;
        if (!GetWindowRect(handler, out rect))
        {
            int error = Marshal.GetLastWin32Error();
            var exception = new System.ComponentModel.Win32Exception(error);
            MessageBox.Show("ERROR: " + error + ": " + exception.Message);
            return;
        }
        Size s = new System.Drawing.Size(rect.Right - rect.Left + 1, rect.Bottom - rect.Top + 1);
        Bitmap bmp = new Bitmap(s.Width, s.Height);
        Graphics g = System.Drawing.Graphics.FromImage(bmp);
        IntPtr dc1 = g.GetHdc();
        IntPtr dc2 = GetDC(handler);
        BitBlt(dc1, 0, 0, s.Width, s.Height, dc2, 0, 0, TernaryRasterOperations.SRCCOPY);
        g.ReleaseHdc(dc1);            
        bmp.Save("screen.bmp");
        bmp.Dispose();
    }

Проблема такая - все нормальные окна захватываются отлично, без перекрытий, артефаков и прочего. Но конкретно программы на Unity захватываются непонятным образом - если оно на заднем плане, то его перекрывают другие окна (чего не происходит с другими не-юнитевскими окнами), если пытаться дальше снять скриншот - то изображение остаётся тем же самым, что было в момент первого скриншота.

Как победить эту проблему? В какую сторону думать?


Ответы (0 шт):