tags:

views:

22

answers:

0

I am capturing output of windows program using following function:

public static Bitmap Get(IntPtr hWnd, int X1, int Y1, int width, int height)
{
    WINDOWINFO winInfo = new WINDOWINFO();
    bool ret = GetWindowInfo(hWnd, ref winInfo);
    if (!ret)
    {
        return null;
    }

    int curheight = height;
    if (curheight <= 0 || curheight > winInfo.rcWindow.Height)
        curheight = winInfo.rcWindow.Height;

    int curwidth = width;
    if (curwidth <= 0 || curwidth > winInfo.rcWindow.Width)
        curwidth = winInfo.rcWindow.Width;

    if (curheight == 0 || curwidth == 0) return null;

    Graphics frmGraphics = Graphics.FromHwnd(hWnd);
    IntPtr hDC = GetWindowDC(hWnd); //gets the entire window
    //IntPtr hDC = frmGraphics.GetHdc(); -- gets the client area, no menu bars, etc..

    System.Drawing.Bitmap tmpBitmap = new System.Drawing.Bitmap(curwidth, curheight, frmGraphics);
    Graphics bmGraphics = Graphics.FromImage(tmpBitmap);
    IntPtr bmHdc = bmGraphics.GetHdc();

    BitBlt(bmHdc, 0, 0, curwidth, curheight, hDC, X1, Y1, TernaryRasterOperations.SRCCOPY);

    bmGraphics.ReleaseHdc(bmHdc);
    ReleaseDC(hWnd, hDC);

    return tmpBitmap;
}

On Development environment everything is excellent, but on windows server 2008 I have following issues:

  1. When there is other window in front - it is getting captured as well

  2. When there is no user connected to RDC - image is black

On other hand, I am able to render webpage images using IE. How I can change behaviour of windows rendering process to get proper results?