散装1935 发表于 2022-3-21 23:44:34

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

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

wp231957 发表于 2022-3-22 05:26:24

自行百度,可以弄,就是狠复杂的说

zzxhh628 发表于 2022-3-22 08:48:59

gdi+有相关的函数,也可通过Cimage类来实现。

散装1935 发表于 2022-3-22 10:20:15

wp231957 发表于 2022-3-22 05:26
自行百度,可以弄,就是狠复杂的说

哎。。。花了很久很久的时间学,就这一个小软件都搞不定,百度查起来资料也是非常乱。。

散装1935 发表于 2022-3-22 10:20:54

zzxhh628 发表于 2022-3-22 08:48
gdi+有相关的函数,也可通过Cimage类来实现。

能具体一点不,麻烦了。。。

zzxhh628 发表于 2022-3-22 12:54:15

首先gdi来实现截图,用Cimage类实现保存图片。这个类是ATL/MFC里面有的,包含上atlimage.h头文件就能使用Cimage类。gdi部分就是先用GetDC获取桌面窗口的DC,CreateCompatibleDC创建兼容DC,获取屏幕宽和高用GetSystemMetrics,用CreateCompatibleBitmap创建兼容位图,用SelectObject选中位图到兼容DC,然后用BitBlt在位图上绘制。把绘制完了的兼容位图用Cimage类的Attach函数附加位图,用Save函数保存成为文件就行了。

散装1935 发表于 2022-3-23 15:16:11

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

谢谢。看来还要好好研究下。

美琴小学生 发表于 2022-4-9 09:07:43

    public partial class frmScreenRoi : Form
    {
      /// <summary></summary>
      int[] ScreenSize = new int { 0, 0, 0, 0 };
      /// <summary></summary>
      int[] ScreenSizePre = new int { 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 = r.Width;
            ScreenSize = 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 = ScreenSize;
                  ScreenSizePre = ScreenSize;
                  this.Invoke((MethodInvoker)delegate {
                        pictureBox2.Location = new Point(ScreenSizePre, ScreenSizePre);
                        pictureBox2.Visible = true;
                  });
                }
                if (ScreenSize > 0 && ScreenSize > 0)
                {
                  if (ScreenSize != ScreenSizePre || ScreenSize != ScreenSizePre)
                  {
                        ScreenSizePre = ScreenSize;
                        ScreenSizePre = ScreenSize;
                     this.Invoke((MethodInvoker)delegate {
                           pictureBox2.Size = new Size(ScreenSizePre, ScreenSizePre);
                           Bitmap Bit = BackBit.Clone(new Rectangle(ScreenSizePre, ScreenSizePre, ScreenSize, ScreenSize), 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 = e.X;
                ScreenSize = e.Y;

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

                //    Bitmap Bit = BackBit.Clone(new Rectangle(ScreenSize, ScreenSize, ScreenSize, ScreenSize), 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 = e.X - ScreenSize;
                ScreenSize = e.Y - ScreenSize;
                _isFirst = false;

                if (ScreenSize > 0 && ScreenSize > 0)
                {
                  try
                  {
                        Bitmap Bit = BackBit.Clone(new Rectangle(ScreenSize, ScreenSize, ScreenSize, ScreenSize), 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

    }

美琴小学生 发表于 2022-4-9 09:09:41

美琴小学生 发表于 2022-4-9 09:07


这个鼠标释放就自动保存截图了,用_isFirst 和在鼠标释放那里修改一下可以改成微信那样,拖动Roi框再保存

美琴小学生 发表于 2022-4-9 09:11:23

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

半透明代码没给,你可以CSDN找

爱喝奶茶 发表于 2022-5-11 09:56:28

额,新人,学了点python,python中有个库可以直接搞定

cnkizy 发表于 2022-8-20 10:47:09

美琴小学生 发表于 2022-4-9 09:07


楼主问C和SDK,你贴C#
页: [1]
查看完整版本: 学了c和sdk,发现还是不够写出一个截屏软件!!!!