0

以下のコードのように DesktopWindow ハンドルを取得する方法を使用して、特定の領域を取得したいと思います。

    [DllImport("user32.dll")]
    static extern IntPtr GetDesktopWindow();

    [DllImport("user32.dll")]
    static extern IntPtr GetDCEx(IntPtr hwnd, IntPtr hrgn, uint flags);

    [DllImport("user32.dll")]
    static extern IntPtr ReleaseDC(IntPtr hwnd, IntPtr hdc);

    public void ScreenShot()
    {
        try
        {
            IntPtr hwnd = GetDesktopWindow();
            IntPtr hdc = GetDCEx(hwnd, IntPtr.Zero, 1027);

            Point temp = new Point(40, 40);
            Graphics g = Graphics.FromHdc(hdc);
            Bitmap bitmap = new Bitmap(mPanel.Width, mPanel.Height, g);

            g.CopyFromScreen(PointToScreen(temp) , PointToScreen(PictureBox.Location) ,  PictureBox.Size);

}

このコードは実際に動作しますが、CopyFromScreen のプロセスから作成されたコピー イメージを取得したいと考えています。Graphics.FromImage(bitmap) のようなコードを使用してみましたが、必要な画像を取得できませんでした... つまり、Image をコピーしました。Graphics オブジェクト fromHdc を使用すると、ビットマップ イメージを取得する方法が見つかりませんでした。DCを使用する必要があります....適切な方法はありますか??

4

1 に答える 1

2

ここでは間違った方向に進んでいます。デスクトップ ハンドルを取得する必要はありません。CopyFromScreen は現在画面に表示されているものをターゲット グラフィックスにコピーするため、画像からグラフィックス オブジェクトを作成する必要があります。次のコードは、画面の左上の 500x500 の画像を作成します。

public static void ScreenShot()
{
    var destBitmap = new Bitmap(500, 500);
    using (var destGraph = Graphics.FromImage(destBitmap))
    {
        destGraph.CopyFromScreen(new Point(), new Point(), destBitmap.Size);
    }
    destBitmap.Save(@"c:\bla.png");
}

本当に HDC がある場合は、gdi32 から BitBlt を使用する必要があります。

[DllImport("gdi32.dll")]
public static extern bool BitBlt(IntPtr hdc, int nXDest, int nYDest, int nWidth, int nHeight, IntPtr hdcSrc, int nXSrc, int nYSrc, int dwRop);
于 2012-11-11T16:07:51.007 に答える