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

来源:互联网 发布:逻辑回归面试题知乎 编辑:程序博客网 时间:2024/04/28 11:10

 

最近在做一个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文件格式保存}

截图效果: