2

C++ での作業に成功しましPrintWindowたが、C# で作業しようとすると、null データのビットマップが返されます。.NET 4.0 で VS 2012 Pro を使用。これが私のコードです:

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

    [DllImport("user32.dll")]
    [return: MarshalAs(UnmanagedType.Bool)]
    public static extern bool PrintWindow(IntPtr hWnd, IntPtr hdcBlt, int nFlags);

    [DllImport("user32.dll")]
    public static extern ushort getLastError();

    static int count = 0;
    public Bitmap getWindow(IntPtr windowHandle)
    {
        RECT rect;
        Window.GetWindowRect(windowHandle, out rect);

        Console.WriteLine(rect.X);
        Console.WriteLine(rect.Y);
        Console.WriteLine(rect.Width);
        Console.WriteLine(rect.Height);
        Console.WriteLine();

        Bitmap bmp = new Bitmap(rect.Width, rect.Height);
        Graphics gfxBmp = Graphics.FromImage(bmp);
        IntPtr hdcBitmap = gfxBmp.GetHdc();

        bool success = PrintWindow(windowHandle, hdcBitmap, 0);
        if (!success)
        {
            Console.WriteLine("Error copying image");
            Console.WriteLine(getLastError());
        }

        bmp.Save("image_" + count++ + ".bmp");

        gfxBmp.ReleaseHdc(hdcBitmap);
        gfxBmp.Dispose();

        return bmp;

    }

出力は次のとおりです。

182
182
664
533

エラー メッセージは表示されず、RECT 境界が正しいため、ハンドルが有効であるように見えます。この例に従って、電卓プログラムを使用して C++ で動作するようにしましたが、電卓を使用した同じコードは C# では動作しません。

C#で動作するために必要です。

4

1 に答える 1

2

要求どおり :-) PrintWinow() 呼び出しの直後に ReleaseHdc を配置してみてください。

こちらをご覧ください。

理由は推測ですが、「HDC がアンマネージ コードによってロックされている限り、マネージ コードからアクセスできないため、C# でビットマップを表示するには、HDC を解放する必要があります」のようなものかもしれません。

于 2013-04-06T22:09:16.587 に答える