Search code examples
c#printingscreenshotscaling

Printing only the active window in C#


I want to print only the active window from a C# application. Using CopyFromScreen() does not work as it takes a screenshot and the window can be partially hidden by other transient windows appearing. So I tried PrintWindow():

private void printDocument1_PrintPage(object sender, PrintPageEventArgs e)
{
    e.Graphics.PageScale = 10.0f;
    Graphics g = e.Graphics;
    PrintWindow(this.Handle, g.GetHdc(), 0);
}

This produces a tiny stamp-sized printout of the window regardless of which PageScale I use. Any ideas?

EDIT This does the trick:

private void printDocument1_PrintPage(object sender, PrintPageEventArgs e)
{
    Graphics myGraphics = CreateGraphics();
    var bitmap = new Bitmap(Width, Height, myGraphics);
    DrawToBitmap(bitmap, new Rectangle(0, 0, bitmap.Width, bitmap.Height));
    e.Graphics.DrawImage(bitmap, 0, 0);
}

Solution

  • Some googling around, and I found: Copying content from a hidden or clipped window in XP?

    It seems you will need to prepare a bitmap for storing the page:

    // Takes a snapshot of the window hwnd, stored in the memory device context hdcMem
    HDC hdc = GetWindowDC(hwnd);
    if (hdc)
    {
        HDC hdcMem = CreateCompatibleDC(hdc);
        if (hdcMem)
        {
            RECT rc;
            GetWindowRect(hwnd, &rc);
    
            HBITMAP hbitmap = CreateCompatibleBitmap(hdc, RECTWIDTH(rc), RECTHEIGHT(rc));
            if (hbitmap)
            {
                SelectObject(hdcMem, hbitmap);
    
                PrintWindow(hwnd, hdcMem, 0);
    
                DeleteObject(hbitmap);
            }
            DeleteObject(hdcMem);
        }
        ReleaseDC(hwnd, hdc);
    }