Вам нужно получить окно Rect
, которое вы пытаетесь захватить.
Чтобы выполнить sh эту задачу, вам нужна структура Rect
и метод, который может получить Rect
вашего окна:
[StructLayout(LayoutKind.Sequential)]
public struct Rect
{
public int left;
public int top;
public int right;
public int bottom;
}
[DllImport("user32.dll")]
public static extern IntPtr GetWindowRect(IntPtr hWnd, ref Rect rect);
Далее просто используйте его:
public static Bitmap GetWindowScreenshotOfProcess(Process process)
{
var rect = new Rect();
GetWindowRect(process.MainWindowHandle, ref rect); // filling rect object
int width = rect.right - rect.left;
int height = rect.bottom - rect.top;
if (width <= 0 || height <= 0)
{
return null;
}
// Just for example, window screenshot export:
var bmp = new Bitmap(width, height);
var graphics = Graphics.FromImage(bmp);
graphics.CopyFromScreen(rect.left, rect.top, 0, 0, new Size(width, height), CopyPixelOperation.SourceCopy);
graphics.DrawImage(bmp, new Rectangle(0, 0, bmp.Width, bmp.Height), 0, 0, bmp.Width, bmp.Height, GraphicsUnit.Pixel);
bmp.Save("c:\\temp\\window_screen.png");
return bmp;
}
Это решение может получить скриншот только из окна переднего плана. Если у вас есть какой-либо другой windows перед целевым окном - вам нужно использовать внутренние функции WinAPI, как правильно упомянуто @ vasily.sib.