Как захватить окно 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 захватываются непонятным образом - если оно на заднем плане, то его перекрывают другие окна (чего не происходит с другими не-юнитевскими окнами), если пытаться дальше снять скриншот - то изображение остаётся тем же самым, что было в момент первого скриншота.
Как победить эту проблему? В какую сторону думать?