问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

再C#中QQ截图的代码怎么写

发布网友 发布时间:2022-05-05 07:47

我来回答

2个回答

热心网友 时间:2023-10-16 05:30

 QQ截图的核心其实就是调用WINDOWS API函数,主要涉及两个核心组件, user32.dll和gdi32.dll。

如下是,C#代码调用上述两个核心组件的完整示例:

namespace WindowsFormsApplication1
{
    /// <summary>
    /// 屏幕捕获类 
    /// </summary>
    public class ScreenCapture
    {
        /// <summary>
        /// 创建一个包含整个桌面的截图Image对象(捕获到的桌面是当前WINDOWS操作系统活动桌面)
        /// </summary>
        /// <returns></returns>
        public Image CaptureScreen()
        {
            return CaptureWindow(User32.GetDesktopWindow());
        }

        /// <summary>
        /// 创建一个包含特定窗口的截图Image对象
        /// </summary>
        /// <param name="handle">启动本程序的句柄窗口(在Windows上这是由Handle属性获得)</param>
        /// <returns></returns>
        public Image CaptureWindow(IntPtr handle)
        {
            // 获取目标窗口的HDC
            IntPtr hdcSrc = User32.GetWindowDC(handle);
            // 获取它的大小
            User32.RECT windowRect = new User32.RECT();
            User32.GetWindowRect(handle, ref windowRect);
            int width = windowRect.right - windowRect.left;
            int height = windowRect.bottom - windowRect.top;
            // 创建设备上下文对象
            IntPtr hdcDest = GDI32.CreateCompatibleDC(hdcSrc);

            IntPtr hBitmap = GDI32.CreateCompatibleBitmap(hdcSrc, width, height);

            IntPtr hOld = GDI32.SelectObject(hdcDest, hBitmap);

            GDI32.BitBlt(hdcDest, 0, 0, width, height, hdcSrc, 0, 0, GDI32.SRCCOPY);

            GDI32.SelectObject(hdcDest, hOld);

            GDI32.DeleteDC(hdcDest);
            User32.ReleaseDC(handle, hdcSrc);

            Image img = Image.FromHbitmap(hBitmap);

            GDI32.DeleteObject(hBitmap);

            return img;
        }

        /// <summary>
        /// 获取特定窗口,并保存它
        /// </summary>
        /// <param name="handle"></param>
        /// <param name="filename"></param>
        /// <param name="format"></param>
        public void CaptureWindowToFile(IntPtr handle, string filename, ImageFormat format)
        {
            Image img = CaptureWindow(handle);
            img.Save(filename, format);
        }

        /// <summary>
        /// 捕获整个windows活动窗口并保存它
        /// </summary>
        /// <param name="filename"></param>
        /// <param name="format"></param>
        public void CaptureScreenToFile(string filename, ImageFormat format)
        {
            Image img = CaptureScreen();
            img.Save(filename, format);
        }

        /// <summary>
        /// GDI32 相关的API函数
        /// </summary>
        private class GDI32
        {

            public const int SRCCOPY = 0x00CC0020;  

            [DllImport("gdi32.dll")]
            public static extern bool BitBlt(IntPtr hObject, int nXDest, int nYDest,
                int nWidth, int nHeight, IntPtr hObjectSource,
                int nXSrc, int nYSrc, int dwRop);
            [DllImport("gdi32.dll")]
            public static extern IntPtr CreateCompatibleBitmap(IntPtr hDC, int nWidth,
                int nHeight);
            [DllImport("gdi32.dll")]
            public static extern IntPtr CreateCompatibleDC(IntPtr hDC);
            [DllImport("gdi32.dll")]
            public static extern bool DeleteDC(IntPtr hDC);
            [DllImport("gdi32.dll")]
            public static extern bool DeleteObject(IntPtr hObject);
            [DllImport("gdi32.dll")]
            public static extern IntPtr SelectObject(IntPtr hDC, IntPtr hObject);
        }

        /// <summary>
        /// User32 API相关函数
        /// </summary>
        private class User32
        {
            [StructLayout(LayoutKind.Sequential)]
            public struct RECT
            {
                public int left;
                public int top;
                public int right;
                public int bottom;
            }

            [DllImport("user32.dll")]
            public static extern IntPtr GetDesktopWindow();
            [DllImport("user32.dll")]
            public static extern IntPtr GetWindowDC(IntPtr hWnd);
            [DllImport("user32.dll")]
            public static extern IntPtr ReleaseDC(IntPtr hWnd, IntPtr hDC);
            [DllImport("user32.dll")]
            public static extern IntPtr GetWindowRect(IntPtr hWnd, ref RECT rect);

        }


    }

}
//  调用示例:
private void button1_Click(object sender, EventArgs e)
        {
            ScreenCapture sc = new ScreenCapture();
            // 捕获整个屏幕并保存到一个文件里
            Image img = sc.CaptureScreen();
            // 将捕获的图片显示在图片控件里
            this.pictureBox1.Image = img;
            // 捕获当前运行窗体并保存在C盘,文件名和后缀为temp.png
            sc.CaptureWindowToFile(this.Handle, "C:\\temp.png", ImageFormat.Gif);
        }

热心网友 时间:2023-10-16 05:30

普通全屏截图 把图片加载到自己的窗体中显示 窗体大小为全屏,且置顶。然后根据用户鼠标绘制矩形来截取图片
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
ef英语哪个好 EF英孚英语培训怎么样? 英孚英语好不好 EF英孚教育到底好不好 大佬们,麦芒7和荣耀10那个值得入手?2500以下的机子还有啥好推荐的么... 介绍几款2500元以前的手机 像素一定要高 其他的不做要求 近期想入手一部安卓手机,价格2200到2500左右…买HTC desire Z还是 三星... 笔记本忘记开机密码怎么办急死了 笔记本电脑屏幕开机锁忘记密码 怎么办?急死了 华硕笔记本电脑开机密码忘记了怎样找回?系统是Windows 7旗舰版... 一淘网的集分宝没地方用? 怎么把代码和运行出来的窗口一起截图? 代码能不能直接调用系统的快捷键实现截屏 秋季职场女性,应该要怎样穿搭才显得成熟大方? vba 可以截屏吗 用什么代码 广发信用卡逾期两期,银行打电话过来没接,被起诉了,怎么办,目前没有那么多钱还,欠了8000 使徒行者 覃欢喜为何自杀 集分宝不能用 如何正确更换换季衣服? 换季尴尬期怎么穿? 我的集分宝怎么不能用 怎样搭配衣服好看图片秋季 秋季怎样搭配衣服好看 换季怎么穿? 情境教学法是新教学方法吗 php 数据库 sql语句 情景教学法是以什么心理学为理论基础 护肤只用大宝可以吗 大宝是在涂完护肤品之后用的吗 情境教学法的教学模式对教学内容,教师和学生特点等有哪些要求 使徒行者三个妈妈怎么死的 《使徒行者》剧情跌宕起伏, 梁家辉和古天乐谁是真卧底? 使徒行者里木容怎么样了 使徒行者阿钉死了么 使徒行者第25集钉姐的妈妈临死前说的一句话是什么意思 使行徒者电影扮演者 射手座女和双鱼座男能发生爱情吗? 射手座女生和双鱼座男生的爱情是怎样的 江苏盐城重大交通事故已致11死,导致此起事故的原因是是什么? 是不是射手女和双鱼男很难得到爱情啊! 朋友于清明节上坟完毕,走后约1.5小时在墓地附近发生火灾,烧毁森林300亩,我朋友需要负什么责任 清明期间,宁波一男子清明扫墓酒驾被抓,为何总有人抱有侥幸心理? 江苏盐城发生重大交通事故,已造成多人伤亡,导致事故发生的原因是什么? 前段时间,也就是清明节,我一个朋友在高速公路上发生了交通事故,被 今年清明期间安徽省境内高速公路上有发生死亡的车祸吗? 联系这次的清明哀悼你发现对一个国家一个民族来说哪些事情是重大灾难? 雪莲晒干了是什么样的 如何鉴别雪莲花? 干的雪莲花怎么吃啊。像一堆烂棉花。好多毛毛的样子。 干雪莲果是什么样?