10

ウィンドウをビットマップとして取得し、そのビットマップを別のウィンドウにレンダリングするために、このチュートリアルに従いました(私のコードではマウスクリックでウィンドウを取得するため、ここにリストされているものよりも少し多くあります)。

私の質問:

そのウィンドウが最小化または非表示 (SW_HIDE) の場合、スクリーン キャプチャが機能しません。最小化または非表示のウィンドウをキャプチャすることはできますか?

4

3 に答える 3

7

PrintWindow APIはうまく機能します。非表示のウィンドウのサムネイルをキャプチャするために使用します。名前にもかかわらず、WM_PRINT や WM_PRINTCLIENT とは異なり、Direct X / WPF ウィンドウを除くほぼすべてのウィンドウで動作します。

いくつかのコード (C#) を追加しましたが、コードの使用方法を確認した後、ビットマップをキャプチャしたときにウィンドウが実際には非表示になっていないことに気付きました。ウィンドウを画面外に表示し、印刷してから再度非表示にしていただけますか?

        public static Bitmap PrintWindow(IntPtr hwnd)
    {
        RECT rc;
        WinUserApi.GetWindowRect(hwnd, out rc);

        Bitmap bmp = new Bitmap(rc.Width, rc.Height, PixelFormat.Format32bppArgb);
        Graphics gfxBmp = Graphics.FromImage(bmp);
        IntPtr hdcBitmap = gfxBmp.GetHdc();
        bool succeeded = WinUserApi.PrintWindow(hwnd, hdcBitmap, 0);
        gfxBmp.ReleaseHdc(hdcBitmap);
        if (!succeeded)
        {
            gfxBmp.FillRectangle(new SolidBrush(Color.Gray), new Rectangle(Point.Empty, bmp.Size));
        }
        IntPtr hRgn = WinGdiApi.CreateRectRgn(0, 0, 0, 0);
        WinUserApi.GetWindowRgn(hwnd, hRgn);
        Region region = Region.FromHrgn(hRgn);
        if (!region.IsEmpty(gfxBmp))
        {
            gfxBmp.ExcludeClip(region);
            gfxBmp.Clear(Color.Transparent);
        }
        gfxBmp.Dispose();
        return bmp;
    }
于 2009-05-07T12:50:46.230 に答える
2

ウィンドウに送信できるメッセージがあり、その内容が選択WM_PRINTしたものにレンダリングされます。WM_PRINTCLIENTHDC

ただし、これらは完全ではありません。標準のWin32コントロールはこれらを正しく処理しますが、アプリのカスタムコントロールは正しく処理しない場合があります。

于 2009-05-06T16:09:20.083 に答える
0

部分的に非表示になっているコントロールのビットマップを取得しようとしています。

描画を行う前にコードを使用しましたが、それと重なるウィンドウが含まれていました。だから..多分あなたはこれを試してみたい. WM_PRINTCLIENT は、実際には表示されていなくても、(私の理解では) コントロール内のすべてを再描画する必要があります。

const int WM_PRINT = 0x317, WM_PRINTCLIENT = 0x318, PRF_CLIENT = 4,
PRF_CHILDREN = 0x10, PRF_NON_CLIENT = 2,
COMBINED_PRINTFLAGS = PRF_CLIENT | PRF_CHILDREN | PRF_NON_CLIENT;
SendMessage(handle, WM_PRINTCLIENT, (int)hdc, COMBINED_PRINTFLAGS);
//GDIStuff.BitBlt(hdc, 0, 0, width, height, hdcControl, 0, 0, (int)GDIStuff.TernaryRasterOperations.SRCCOPY);

前のコードはコメントアウトされています。これは、 Pocket PC: Draw control to bitmap (受け入れられた回答)にあるコードに基づいています。基本的には、ティム・ロビンソンがこのスレッドで提案しているものと同じです。

また、こちらも ご覧ください http://www.tcx.be/blog/2004/paint-control-onto-graphics/

于 2011-06-17T16:11:10.177 に答える