鱼C论坛

 找回密码
 立即注册
查看: 2698|回复: 11

学了c和sdk,发现还是不够写出一个截屏软件!!!!

[复制链接]
发表于 2022-3-21 23:44:34 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
把小甲鱼的带你学c带你飞买来基本学完,然后看完sdk的视频,发现还是不能实现我只想要写一个截屏软件的愿望!!!花了半年的时间啊!一个类似windows自带的截屏软件就这么难吗?求大家帮我一下,需要用到那些api消息和函数,我自己去查了看是否能自己写出来,谢谢了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-3-22 05:26:24 From FishC Mobile | 显示全部楼层
自行百度,可以弄,就是狠复杂的说
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-3-22 08:48:59 From FishC Mobile | 显示全部楼层
gdi+有相关的函数,也可通过Cimage类来实现。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-3-22 10:20:15 | 显示全部楼层
wp231957 发表于 2022-3-22 05:26
自行百度,可以弄,就是狠复杂的说

哎。。。花了很久很久的时间学,就这一个小软件都搞不定,百度查起来资料也是非常乱。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-3-22 10:20:54 | 显示全部楼层
zzxhh628 发表于 2022-3-22 08:48
gdi+有相关的函数,也可通过Cimage类来实现。

能具体一点不,麻烦了。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-3-22 12:54:15 From FishC Mobile | 显示全部楼层
首先gdi来实现截图,用Cimage类实现保存图片。这个类是ATL/MFC里面有的,包含上atlimage.h头文件就能使用Cimage类。gdi部分就是先用GetDC获取桌面窗口的DC,CreateCompatibleDC创建兼容DC,获取屏幕宽和高用GetSystemMetrics,用CreateCompatibleBitmap创建兼容位图,用SelectObject选中位图到兼容DC,然后用BitBlt在位图上绘制。把绘制完了的兼容位图用Cimage类的Attach函数附加位图,用Save函数保存成为文件就行了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-3-23 15:16:11 | 显示全部楼层
zzxhh628 发表于 2022-3-22 12:54
首先gdi来实现截图,用Cimage类实现保存图片。这个类是ATL/MFC里面有的,包含上atlimage.h头文件就能使用Ci ...

谢谢。看来还要好好研究下。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-9 09:07:43 | 显示全部楼层
    public partial class frmScreenRoi : Form
    {
        /// <summary>  </summary>
        int[] ScreenSize = new int[4] { 0, 0, 0, 0 };
        /// <summary>  </summary>
        int[] ScreenSizePre = new int[4] { 0, 0, 0, 0 };

        /// <summary>  </summary>
        Bitmap BackBit = null;


        /// <summary> 刷新线程 </summary>
        Thread thdUpdate;
        /// <summary> 退出线程 </summary>
        bool _isquit = false;
        /// <summary> 鼠标按下 </summary>
        bool _isMouseDown = false;
        /// <summary> 第一次 按下+移动+释放 </summary>
        bool _isFirst = true;

        #region 构造
        public frmScreenRoi()
        {
            InitializeComponent();
        }

        private void frmScreenRoi_Load(object sender, EventArgs e)
        {
            Rectangle r = Screen.PrimaryScreen.Bounds;
            BackBit = new Bitmap(r.Width, r.Height);//截取的大小
            Graphics g = Graphics.FromImage(BackBit);
            g.CopyFromScreen(new Point(0, 0), new Point(0, 0), BackBit.Size);

            //窗体最大化,及相关处理
            this.Width = r.Width;
            this.Height = r.Height;
            this.Left = 0;
            this.Top = 0;
            this.TopMost = true;

            ScreenSize[2] = r.Width;
            ScreenSize[3] = r.Height;

            pictureBox1.bitmap = BackBit;

            thdUpdate = new Thread(Loop);
            thdUpdate.Start();
        }
        
        private void frmScreenRoi_FormClosing(object sender, FormClosingEventArgs e)
        {
            _isquit = true;
            Thread.Sleep(200);
            thdUpdate?.Abort();
        }
        #endregion

        private void Loop()
        {
            while (!_isquit)
            {
                Thread.Sleep(10);
                if (_isMouseDown)
                {
                    _isMouseDown = false;
                    ScreenSizePre[0] = ScreenSize[0];
                    ScreenSizePre[1] = ScreenSize[1];
                    this.Invoke((MethodInvoker)delegate {
                        pictureBox2.Location = new Point(ScreenSizePre[0], ScreenSizePre[1]);
                        pictureBox2.Visible = true;
                    });
                }
                if (ScreenSize[2] > 0 && ScreenSize[3] > 0)
                {
                    if (ScreenSize[2] != ScreenSizePre[2] || ScreenSize[3] != ScreenSizePre[3]) 
                    {
                        ScreenSizePre[2] = ScreenSize[2];
                        ScreenSizePre[3] = ScreenSize[3];
                       this.Invoke((MethodInvoker)delegate {
                           pictureBox2.Size = new Size(ScreenSizePre[2], ScreenSizePre[3]);
                           Bitmap Bit = BackBit.Clone(new Rectangle(ScreenSizePre[0], ScreenSizePre[1], ScreenSize[2], ScreenSize[3]), BackBit.PixelFormat);
                           pictureBox2.BackgroundImage = Bit;
                        });
                    }
                }
                else
                {
                    this.Invoke((MethodInvoker)delegate {
                        pictureBox2.Size = new Size(0, 0);
                    });
                }
            }
        }

        #region 画区域
        //鼠标按下
        private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
        {
            if (_isFirst)
            {
                _isMouseDown = true;
                ScreenSize[0] = e.X;
                ScreenSize[1] = e.Y;

                //pictureBox2.Location = new Point(e.X, e.Y);
                //pictureBox2.Visible = true;
            }
        }
        //鼠标移动
        private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
        {
            if (_isFirst)
            {
                ScreenSize[2] = e.X - ScreenSize[0];
                ScreenSize[3] = e.Y - ScreenSize[1];
                //if (ScreenSize[2] > 0 && ScreenSize[3] > 0)
                //{
                //    //SuspendLayout();
                //    pictureBox2.Size = new Size(ScreenSize[2], ScreenSize[3]);

                //    Bitmap Bit = BackBit.Clone(new Rectangle(ScreenSize[0], ScreenSize[1], ScreenSize[2], ScreenSize[3]), BackBit.PixelFormat);
                //    pictureBox2.BackgroundImage = Bit;
                //    //ResumeLayout(true);

                //}
                //else
                //{
                //    pictureBox2.Size = new Size(0, 0);
                //}
            }
        }
        //鼠标释放
        private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
        {
            if (_isFirst)
            {
                ScreenSize[2] = e.X - ScreenSize[0];
                ScreenSize[3] = e.Y - ScreenSize[1];
                _isFirst = false;

                if (ScreenSize[2] > 0 && ScreenSize[3] > 0)
                {
                    try
                    {
                        Bitmap Bit = BackBit.Clone(new Rectangle(ScreenSize[0], ScreenSize[1], ScreenSize[2], ScreenSize[3]), BackBit.PixelFormat);
                        DateTime now = DateTime.Now;
                        string SavePath = PathTool.DataOutImagePath + now.ToString("yyyy-MM-dd") + "\";
                        string FileName = "Screen_" + now.ToString("hhmmss_fff") + ".bmp";
                        if (!Directory.Exists(SavePath))
                            Directory.CreateDirectory(SavePath);
                        Bit.Save(SavePath + FileName);
                        Log.Instance().Enqueue("自定义截图完成,保存路径:" + SavePath + FileName, SagensColor.Black);
                    }
                    catch (Exception ex)
                    {
                        Log.Instance().Enqueue(ex);
                    }
                }
                this.Close();
            }
        }

        private void pictureBox1_MouseClick(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Right) this.Close();
        }
        private void pictureBox1_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
        {
            this.Close();
        }
        private void frmScreenRoi_KeyPress(object sender, KeyPressEventArgs e)
        {
            this.Close();
        }
        #endregion

    }
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-9 09:09:41 | 显示全部楼层

这个鼠标释放就自动保存截图了,用_isFirst 和在鼠标释放那里修改一下可以改成微信那样,拖动Roi框再保存
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-9 09:11:23 | 显示全部楼层
美琴小学生 发表于 2022-4-9 09:09
这个鼠标释放就自动保存截图了,用_isFirst 和在鼠标释放那里修改一下可以改成微信那样,拖动Roi框再保存

半透明代码没给,你可以CSDN找
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-5-11 09:56:28 | 显示全部楼层
额,新人,学了点python,python中有个库可以直接搞定
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-20 10:47:09 | 显示全部楼层

楼主问C和SDK,你贴C#
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-23 18:07

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表