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。当我使用来自 Hdc 的 Graphics 对象时,我找不到获取位图图像的方法。我必须使用 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 回答