c # - Tegne vindue til billedfil

Indlæg af Hanne Mølgaard Plasc

Problem



Nogen ved, hvorfor dette holder tilbage et tomt billede? Jeg fandt denne funktion her. [7]


Jeg sender i et håndtag til en notesblok proces/vindue.


    public static Image DrawToBitmap(IntPtr handle)
    {
        Bitmap image = new Bitmap(500, 500, System.Drawing.Imaging.PixelFormat.Format32bppArgb);

        using (Graphics graphics = Graphics.FromImage(image))
        {
            IntPtr hDC = graphics.GetHdc();
            SendMessage(new HandleRef(graphics, handle), WM\_PRINT, hDC, PRF\_CHILDREN);
            graphics.ReleaseHdc(hDC);
        }
        return image;
    } 


Jeg gør brug af ovenstående som sådan:


Image myimage = DrawToBitmap(handle);

myimage.Save("C:\here.png", ImageFormat.Png);


Tak alt for hjælp


Opdater



Jeg tror, ​​jeg har formået at få fejlkoden fra SendMessage ved hjælp af nedenstående:


if (SendMessage(handle, WM\_PRINT, hDC, PRF\_CLIENT))
{
    Console.WriteLine("Success!");
}
else
{
    Console.WriteLine("Error: " + Marshal.GetLastWin32Error());
}


Jeg får en fejl på 8, og jeg fandt det ikke nok hukommelse? Jeg har over 500 MB ledig! Måske forstår jeg dette forkert?

Bedste reference


I stedet for SendMessage kan du bare bruge PrintWindow


Her er en prøve


public static Image DrawToBitmap(IntPtr handle)
{
    RECT rect = new RECT();
    GetWindowRect(handle, ref rect);

    Bitmap image = new Bitmap(rect.Right - rect.Left, rect.Bottom - rect.Top);

    using (Graphics graphics = Graphics.FromImage(image))
    {
        IntPtr hDC = graphics.GetHdc();
        PrintWindow(new HandleRef(graphics, handle), hDC, 0);
        graphics.ReleaseHdc(hDC);
    }

    return image;
}

#region Interop

[DllImport("USER32.DLL")]
private static extern bool PrintWindow(HandleRef hwnd, IntPtr hdcBlt, int nFlags);

[DllImport("user32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool GetWindowRect(IntPtr hWnd, ref RECT lpRect);

[StructLayout(LayoutKind.Sequential)]
private struct RECT
{
    public int Left;
    public int Top;
    public int Right;
    public int Bottom;
}

#endregion

Andre referencer 1


Prøv at sende PRF\_CLIENT eller PRF\_NONCLIENT til SendMessage ud over PRF\_CHILDREN.


Også, hvordan kommer du ud af håndtaget, som du overfører til funktionen?