鱼C论坛

 找回密码
 立即注册
查看: 1910|回复: 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 | 显示全部楼层
  1.     public partial class frmScreenRoi : Form
  2.     {
  3.         /// <summary>  </summary>
  4.         int[] ScreenSize = new int[4] { 0, 0, 0, 0 };
  5.         /// <summary>  </summary>
  6.         int[] ScreenSizePre = new int[4] { 0, 0, 0, 0 };

  7.         /// <summary>  </summary>
  8.         Bitmap BackBit = null;


  9.         /// <summary> 刷新线程 </summary>
  10.         Thread thdUpdate;
  11.         /// <summary> 退出线程 </summary>
  12.         bool _isquit = false;
  13.         /// <summary> 鼠标按下 </summary>
  14.         bool _isMouseDown = false;
  15.         /// <summary> 第一次 按下+移动+释放 </summary>
  16.         bool _isFirst = true;

  17.         #region 构造
  18.         public frmScreenRoi()
  19.         {
  20.             InitializeComponent();
  21.         }

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

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

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

  36.             pictureBox1.bitmap = BackBit;

  37.             thdUpdate = new Thread(Loop);
  38.             thdUpdate.Start();
  39.         }
  40.         
  41.         private void frmScreenRoi_FormClosing(object sender, FormClosingEventArgs e)
  42.         {
  43.             _isquit = true;
  44.             Thread.Sleep(200);
  45.             thdUpdate?.Abort();
  46.         }
  47.         #endregion

  48.         private void Loop()
  49.         {
  50.             while (!_isquit)
  51.             {
  52.                 Thread.Sleep(10);
  53.                 if (_isMouseDown)
  54.                 {
  55.                     _isMouseDown = false;
  56.                     ScreenSizePre[0] = ScreenSize[0];
  57.                     ScreenSizePre[1] = ScreenSize[1];
  58.                     this.Invoke((MethodInvoker)delegate {
  59.                         pictureBox2.Location = new Point(ScreenSizePre[0], ScreenSizePre[1]);
  60.                         pictureBox2.Visible = true;
  61.                     });
  62.                 }
  63.                 if (ScreenSize[2] > 0 && ScreenSize[3] > 0)
  64.                 {
  65.                     if (ScreenSize[2] != ScreenSizePre[2] || ScreenSize[3] != ScreenSizePre[3])
  66.                     {
  67.                         ScreenSizePre[2] = ScreenSize[2];
  68.                         ScreenSizePre[3] = ScreenSize[3];
  69.                        this.Invoke((MethodInvoker)delegate {
  70.                            pictureBox2.Size = new Size(ScreenSizePre[2], ScreenSizePre[3]);
  71.                            Bitmap Bit = BackBit.Clone(new Rectangle(ScreenSizePre[0], ScreenSizePre[1], ScreenSize[2], ScreenSize[3]), BackBit.PixelFormat);
  72.                            pictureBox2.BackgroundImage = Bit;
  73.                         });
  74.                     }
  75.                 }
  76.                 else
  77.                 {
  78.                     this.Invoke((MethodInvoker)delegate {
  79.                         pictureBox2.Size = new Size(0, 0);
  80.                     });
  81.                 }
  82.             }
  83.         }

  84.         #region 画区域
  85.         //鼠标按下
  86.         private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
  87.         {
  88.             if (_isFirst)
  89.             {
  90.                 _isMouseDown = true;
  91.                 ScreenSize[0] = e.X;
  92.                 ScreenSize[1] = e.Y;

  93.                 //pictureBox2.Location = new Point(e.X, e.Y);
  94.                 //pictureBox2.Visible = true;
  95.             }
  96.         }
  97.         //鼠标移动
  98.         private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
  99.         {
  100.             if (_isFirst)
  101.             {
  102.                 ScreenSize[2] = e.X - ScreenSize[0];
  103.                 ScreenSize[3] = e.Y - ScreenSize[1];
  104.                 //if (ScreenSize[2] > 0 && ScreenSize[3] > 0)
  105.                 //{
  106.                 //    //SuspendLayout();
  107.                 //    pictureBox2.Size = new Size(ScreenSize[2], ScreenSize[3]);

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

  111.                 //}
  112.                 //else
  113.                 //{
  114.                 //    pictureBox2.Size = new Size(0, 0);
  115.                 //}
  116.             }
  117.         }
  118.         //鼠标释放
  119.         private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
  120.         {
  121.             if (_isFirst)
  122.             {
  123.                 ScreenSize[2] = e.X - ScreenSize[0];
  124.                 ScreenSize[3] = e.Y - ScreenSize[1];
  125.                 _isFirst = false;

  126.                 if (ScreenSize[2] > 0 && ScreenSize[3] > 0)
  127.                 {
  128.                     try
  129.                     {
  130.                         Bitmap Bit = BackBit.Clone(new Rectangle(ScreenSize[0], ScreenSize[1], ScreenSize[2], ScreenSize[3]), BackBit.PixelFormat);
  131.                         DateTime now = DateTime.Now;
  132.                         string SavePath = PathTool.DataOutImagePath + now.ToString("yyyy-MM-dd") + "\";
  133.                         string FileName = "Screen_" + now.ToString("hhmmss_fff") + ".bmp";
  134.                         if (!Directory.Exists(SavePath))
  135.                             Directory.CreateDirectory(SavePath);
  136.                         Bit.Save(SavePath + FileName);
  137.                         Log.Instance().Enqueue("自定义截图完成,保存路径:" + SavePath + FileName, SagensColor.Black);
  138.                     }
  139.                     catch (Exception ex)
  140.                     {
  141.                         Log.Instance().Enqueue(ex);
  142.                     }
  143.                 }
  144.                 this.Close();
  145.             }
  146.         }

  147.         private void pictureBox1_MouseClick(object sender, MouseEventArgs e)
  148.         {
  149.             if (e.Button == MouseButtons.Right) this.Close();
  150.         }
  151.         private void pictureBox1_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
  152.         {
  153.             this.Close();
  154.         }
  155.         private void frmScreenRoi_KeyPress(object sender, KeyPressEventArgs e)
  156.         {
  157.             this.Close();
  158.         }
  159.         #endregion

  160.     }
复制代码
想知道小甲鱼最近在做啥?请访问 -> 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-4-20 09:44

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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