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文件格式保存 }
截图效果:
相关文章推荐
- 几行代码帮您实现Win7窗体的打开效果(C#)
- C#模拟MSN窗体抖动的实现代码
- 使用C#实现Form窗体的淡入淡出效果
- c# 实现用鼠标拖动没有标题栏的窗口(窗体的任何部分都可实现拖动效果)
- C#实现WinForm窗体逐渐显示效果
- c#代码实现轴向镂空效果
- C#实现定时全屏截图并且保存到预先设定好的文件夹中的代码示例
- C#实现窗体淡入淡出效果的几种方法
- C# 无边框窗体之窗体移动实现代码
- 用C#实现窗体效果
- C#无边框窗体实现以及拖动代码
- SilverLight使用C#代码实现3D透视效果
- C#迅雷七窗体特效,使用DWM实现Aero Glass效果
- 使用C#实现在屏幕上画图效果的代码实例
- C#窗体的最大化/最小化/还原/最小化到托盘/NotifyIcon的代码实现
- 使用C#实现WinForm窗体的动画效果
- C#窗体截图保存的实现
- [转] c#有关winform的两个代码片段(多线程操作窗体控件与窗体淡入淡出效果)
- C#实现具有Aero效果的窗体
- C#实现,黑白照片的代码,联想可以实现老照片效果