I'm trying to capture only a specific Window in the desktop but I'm getting a mixed image, part of window and part desktop area.
What am I missing?
Here's my code:
RECT rect = new RECT();
if (!SetForegroundWindow(handle))
throw new Win32Exception(Marshal.GetLastWin32Error());
if (!GetWindowRect(handle, out rect))
throw new Win32Exception(Marshal.GetLastWin32Error());
Thread.Sleep(500);
Rectangle windowSize = rect.ToRectangle();
Bitmap target = new Bitmap(windowSize.Width, windowSize.Height);
using (Graphics g = Graphics.FromImage(target))
{
g.CopyFromScreen(0, 0, 0, 0, new Size(windowSize.Width, windowSize.Height));
}
target.Save("foo.png", System.Drawing.Imaging.ImageFormat.Png);
I think the problem in your code is this line:
g.CopyFromScreen(0, 0, 0, 0, new Size(windowSize.Width, windowSize.Height));
It should be:
g.CopyFromScreen(windowSize.X, windowSize.Y, 0, 0, new Size(windowSize.Width, windowSize.Height));
Here is the method I personally use to get an image of a particular window - it might come in handy:
public Bitmap GetScreenshot()
{
IntPtr hwnd = ihandle;//handle here
RECT rc;
Win32.GetWindowRect(new HandleRef(null, hwnd), out rc);
Bitmap bmp = new Bitmap(rc.Right - rc.Left, rc.Bottom - rc.Top, PixelFormat.Format32bppArgb);
Graphics gfxBmp = Graphics.FromImage(bmp);
IntPtr hdcBitmap;
try
{
hdcBitmap = gfxBmp.GetHdc();
}
catch
{
return null;
}
bool succeeded = Win32.PrintWindow(hwnd, hdcBitmap, 0);
gfxBmp.ReleaseHdc(hdcBitmap);
if (!succeeded)
{
gfxBmp.FillRectangle(new SolidBrush(Color.Gray), new Rectangle(Point.Empty, bmp.Size));
}
IntPtr hRgn = Win32.CreateRectRgn(0, 0, 0, 0);
Win32.GetWindowRgn(hwnd, hRgn);
Region region = Region.FromHrgn(hRgn);//err here once
if (!region.IsEmpty(gfxBmp))
{
gfxBmp.ExcludeClip(region);
gfxBmp.Clear(Color.Transparent);
}
gfxBmp.Dispose();
return bmp;
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With