繁体   English   中英

选择C#矩形的部分屏幕截图

[英]Partial screenshot with rectangle of selection c#

我正在尝试截取屏幕的部分屏幕截图并将其放在图片框中。 用户必须绘制一个矩形,然后我必须获取矩形内的部分。

protected override void OnMouseDown(MouseEventArgs e)
{
    mRect = new Rectangle(e.X, e.Y, 0, 0);
    this.Invalidate();
}

protected override void OnMouseMove(MouseEventArgs e)
{
    if( e.Button == MouseButtons.Left)
    {
        mRect = new Rectangle(mRect.Left, mRect.Top, e.X - mRect.Left, e.Y - mRect.Top);
        this.Invalidate();
    }
}


protected override void OnPaint(PaintEventArgs e)
{

    using(Pen pen = new Pen(Color.Red, 1))
    {
    e.Graphics.DrawRectangle(pen, mRect);
    }
}

使用此代码,我可以绘制矩形,但是我不知道如何截屏。 也许使用CopyToScreen功能?

如果有人有想法?

谢谢!

这是我使用的一些代码-它占据了整个桌面

    public static Bitmap GetScreenAsBmp()
    {
        int min_x=0, max_x=0, min_y=0, max_y=0;
        foreach (Screen s in Screen.AllScreens)
        {
            min_x = MinOf(min_x, s.Bounds.Left);
            max_x = MaxOf(max_x, s.Bounds.Right);
            min_y = MinOf(min_y, s.Bounds.Top);
            max_y = MaxOf(max_y, s.Bounds.Bottom);
        }
        Bitmap bmp = new Bitmap(max_x - min_x, max_y - min_y);
        Graphics dst_dc =  Graphics.FromImage(bmp);
        dst_dc.CopyFromScreen(min_x, min_y, 0, 0, new Size(max_x - min_x, max_y - min_y));
        dst_dc.Dispose();
        return bmp;
    }

这是该问题的完整解决方案。

它由一个Button触发,然后:

  • 创建并设置第二个Form样式
    • 是透明的,没有边界等,并充满了屏幕
    • 具有绘制Rectangle所需的所有事件
  • 在绘制矩形之后(即在MouseUp之后)复制屏幕
  • 并将Bitmap复制到第一个PictureBox上的PictureBox的图像中。
  • 最后,它关闭第二个窗体。 在屏幕复制过程中,两个窗口都是隐藏的,因此您可以获取屏幕本身及其所有内容。

请注意,许多视频重叠无法通过这种方式捕获!

请注意,此代码始终从第一个屏幕捕获!

为了获得最佳可用性,应该以某种方式告知用户,他应该在按下Button并且窗口消失后才绘制框架!

要使用它,只需将一个Button和一个PictureBox添加到您的Form

public partial class Form1 : Form
{
  public Form1()
  {
      InitializeComponent();
  }

  Form form2;
  Point MD = Point.Empty;
  Rectangle rect = Rectangle.Empty;

  private void button2_Click(object sender, EventArgs e)
  {
     Hide();
     form2 = new Form();
     form2.BackColor = Color.Wheat;
     form2.TransparencyKey = form2.BackColor;
     form2.ControlBox = false;
     form2.MaximizeBox = false;
     form2.MinimizeBox = false;
     form2.FormBorderStyle = FormBorderStyle.None;
     form2.WindowState = FormWindowState.Maximized;
     form2.MouseDown += form2_MouseDown;
     form2.MouseMove += form2_MouseMove;
     form2.Paint += form2_Paint;
     form2.MouseUp += form2_MouseUp;

     form2.Show();
 }

 void form2_MouseDown(object sender, MouseEventArgs e)
 {
     MD = e.Location;
 }

 void form2_MouseMove(object sender, MouseEventArgs e)
 {
     if (e.Button !=MouseButtons.Left) return;
     Point MM = e.Location;
     rect = new Rectangle(Math.Min(MD.X, MM.X), Math.Min(MD.Y, MM.Y),
                          Math.Abs(MD.X - MM.X), Math.Abs(MD.Y - MM.Y));
     form2.Invalidate();
 }

 void form2_Paint(object sender, PaintEventArgs e)
 {
     e.Graphics.DrawRectangle(Pens.Red, rect);
 }

  void form2_MouseUp(object sender, MouseEventArgs e)
  {
     form2.Hide();
     Screen scr = Screen.AllScreens[0];
     Bitmap bmp = new Bitmap(rect.Width, rect.Height);
     using (Graphics G = Graphics.FromImage(bmp))
     {
         G.CopyFromScreen(rect.Location, Point.Empty, rect.Size,
                          CopyPixelOperation.SourceCopy);
         pictureBox1.Image = bmp;
     }
     form2.Close();
     Show();
  }

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM