您的位置:首页 > 编程语言 > C#

C#实现窗体截图(代码+效果)

2013-11-06 11:35 246 查看

最近在做一个QQ找茬游戏的外挂,第一步便是窗体截图,因为以前从来没有涉及过图像处理方面的知识,感觉还是有点小难的。理论上讲做这个东西用C++会比较简单,但由于我一看到MFC就眼晕,所以还是选择了熟悉的C#语言。

C#写截图要用到传说中的.net没有提供的叫做BitBlt的函数,而BitBlt函数要求有被截窗体的设备驱动器句柄,需要用GetDC(hwnd)函数获得,当然之后还要用ReleaseDC(hdc)释放。但是要得到窗体的设备驱动器句柄又要求有被截窗体的窗体句柄,需要调用FindWindow()函数,有了窗体句柄再用GetClientRect()同时可以得到窗体的大小。看到这么多API,给我的第一感觉是头大。

然后我想到最简单的方法是用google搜到代码,直接考上去就得了,搜了半天却发现网上鲜有C#窗体截图的东西,铺天盖地都是屏幕截图。当然用屏幕截图也可以做,但是局限性太大,我又不愿意走弯路,所以宁愿麻烦点自己写窗体截图的代码。查了很多资料又调试了N次今天下午终于把窗体截图给搞定了,哈哈,虽然只是写出来了窗体截图,但是学到了好多知识,好高兴啊,吃饭都比前几天香了。

不多说了,上代码和我截出来的图吧,鼓励下自己,加油,后续工作更重要呢。

调用API相关:

[System.Runtime.InteropServices.DllImportAttribute("gdi32.dll")]
private static extern bool BitBlt
(
IntPtr hdcDest,    //目标DC的句柄
int nXDest,        //目标DC的矩形区域的左上角的x坐标
int nYDest,        //目标DC的矩形区域的左上角的y坐标
int nWidth,        //目标DC的句型区域的宽度值
int nHeight,       //目标DC的句型区域的高度值
IntPtr hdcSrc,     //源DC的句柄
int nXSrc,         //源DC的矩形区域的左上角的x坐标
int nYSrc,         //源DC的矩形区域的左上角的y坐标
System.Int32 dwRo  //光栅的处理数值
);

[System.Runtime.InteropServices.DllImportAttribute("user32.dll")]
public extern static IntPtr FindWindow(string lpClassName, string lpWindowName);

[System.Runtime.InteropServices.DllImportAttribute("user32.dll")]
public static extern int GetWindowRect(IntPtr hWnd, out Rectangle lpRect);

[System.Runtime.InteropServices.DllImportAttribute("user32.dll")]
public extern static IntPtr GetDC(IntPtr hWnd);

[System.Runtime.InteropServices.DllImportAttribute("user32.dll")]
public extern static int ReleaseDC(IntPtr hWnd, IntPtr hDC);


截图部分代码

IntPtr hwnd1 = FindWindow(null, "**");
if (!hwnd1.Equals(IntPtr.Zero))
{
GetWindowRect(hwnd1, out rect);  //获得目标窗体的大小
Bitmap QQPic = new Bitmap(rect.Width, rect.Height);
Graphics g1 = Graphics.FromImage(QQPic);
IntPtr hdc1 = GetDC(hwnd1);
IntPtr hdc2 = g1.GetHdc();  //得到Bitmap的DC
BitBlt(hdc2, 0, 0, rect.Width, rect.Height, hdc1, 0, 0, 13369376);
g1.ReleaseHdc(hdc2);  //释放掉Bitmap的DC
QQPic.Save("QQpic.jpg", System.Drawing.Imaging.ImageFormat.Jpeg);
//以JPG文件格式保存
}


截图效果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: