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

本文分享了使用C#进行特定窗体截图的过程与心得,包括调用API获取窗体句柄、创建位图及利用BitBlt函数完成截图等关键技术步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

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

截图效果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值