我想通过使用获取桌面窗口句柄的方式获取特定区域,如下图所示。
[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)这样的代码,但是我无法获得我想要的图像...我的意思是,复制图像。当我使用来自Hdc的图形对象时,我找不到获取位图图像的方法。我必须使用DC。有什么合适的方法吗??
你在这里走错了路,你不需要获取桌面句柄,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);