C# 允许用户在屏幕上指定一个点

C# 允许用户在屏幕上指定一个点,c#,drag-and-drop,screenshot,C#,Drag And Drop,Screenshot,我有一个程序,可以拍摄一个图像(50px上大约50px),对图像进行处理并上传。目前,用户仍然需要截图,打开油漆,裁剪出所需的部分,并将其复制到我的程序中 我希望通过让用户将某种十字线拖动到屏幕上所需的点并释放它,使其更容易/更快。然后,我的程序对该区域进行了一个小屏幕截图(已经知道如何做了),并利用该屏幕截图进行了一些操作 问题是,我如何才能做到这一点我怎样才能拥有一个用户可以拖动到表单外的点并释放的可拖动十字线,以指定程序要使用的屏幕坐标?您需要执行以下所有操作: 使用MouseDown/M

我有一个程序,可以拍摄一个图像(50px上大约50px),对图像进行处理并上传。目前,用户仍然需要截图,打开油漆,裁剪出所需的部分,并将其复制到我的程序中

我希望通过让用户将某种十字线拖动到屏幕上所需的点并释放它,使其更容易/更快。然后,我的程序对该区域进行了一个小屏幕截图(已经知道如何做了),并利用该屏幕截图进行了一些操作


问题是,我如何才能做到这一点我怎样才能拥有一个用户可以拖动到表单外的点并释放的可拖动十字线,以指定程序要使用的屏幕坐标?

您需要执行以下所有操作:

  • 使用MouseDown/MouseMove/MouseUp事件跟踪十字线的拖动时间和地点
  • 拖动十字线时,将控件的Capture属性设置为True,以便在鼠标离开窗体后继续接收MouseMove事件
  • 通过获取适当的窗口句柄并直接为其创建图形对象,将十字线直接绘制到桌面窗口(并使桌面窗口无效以擦除十字线)。桌面窗口句柄始终为0
  • 绘制到桌面非常简单:

    using (var g = Graphics.FromHwnd(IntPtr.Zero))
    {
        g.DrawLine(SystemPens.WindowText, 0, 0, 200, 200);
    }
    

    要删除绘制的内容,您需要使用平台调用调用InvalidateBu立以找到适当的位置。

    您需要执行以下所有操作:

  • 使用MouseDown/MouseMove/MouseUp事件跟踪十字线的拖动时间和地点
  • 拖动十字线时,将控件的Capture属性设置为True,以便在鼠标离开窗体后继续接收MouseMove事件
  • 通过获取适当的窗口句柄并直接为其创建图形对象,将十字线直接绘制到桌面窗口(并使桌面窗口无效以擦除十字线)。桌面窗口句柄始终为0
  • 绘制到桌面非常简单:

    using (var g = Graphics.FromHwnd(IntPtr.Zero))
    {
        g.DrawLine(SystemPens.WindowText, 0, 0, 200, 200);
    }
    

    要删除所绘制的内容,需要使用平台调用调用InvalidateBu立,以找到适当的位置。

    下面是一个快速而肮脏的示例,允许用户左键单击并拖动PictureBox,然后在光标下方获取图像。当用户快速移动时,它不会很好地更新,不过:

    public partial class Form1 : Form
    {
    
        public Form1()
        {
            InitializeComponent();
            pictureBox1.Cursor = Cursors.Cross;
        }
    
        private Bitmap bmp = null;
        private Graphics G = null;
    
        private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
        {
            if (e.Button == System.Windows.Forms.MouseButtons.Left)
            {
                if (bmp == null)
                {
                    bmp = new Bitmap(pictureBox1.Width, pictureBox1.Height);
                    G = Graphics.FromImage(bmp);
                }
            }
        }
    
        private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
        {
            if (e.Button == System.Windows.Forms.MouseButtons.Left)
            {
                if (bmp != null && G != null)
                {
                    Rectangle rc = new Rectangle(Cursor.Position, new Size(1, 1));
                    rc.Inflate(pictureBox1.Width / 2, pictureBox1.Height / 2);
                    G.CopyFromScreen(rc.Location, new Point(0, 0), rc.Size);
                    pictureBox1.Image = bmp;
                }    
            }
        }
    
    }
    

    下面是一个快速而肮脏的示例,它允许用户在PictureBox上单击并拖动鼠标左键,然后在光标下获取图像。当用户快速移动时,它不会很好地更新,不过:

    public partial class Form1 : Form
    {
    
        public Form1()
        {
            InitializeComponent();
            pictureBox1.Cursor = Cursors.Cross;
        }
    
        private Bitmap bmp = null;
        private Graphics G = null;
    
        private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
        {
            if (e.Button == System.Windows.Forms.MouseButtons.Left)
            {
                if (bmp == null)
                {
                    bmp = new Bitmap(pictureBox1.Width, pictureBox1.Height);
                    G = Graphics.FromImage(bmp);
                }
            }
        }
    
        private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
        {
            if (e.Button == System.Windows.Forms.MouseButtons.Left)
            {
                if (bmp != null && G != null)
                {
                    Rectangle rc = new Rectangle(Cursor.Position, new Size(1, 1));
                    rc.Inflate(pictureBox1.Width / 2, pictureBox1.Height / 2);
                    G.CopyFromScreen(rc.Location, new Point(0, 0), rc.Size);
                    pictureBox1.Image = bmp;
                }    
            }
        }
    
    }
    

    这是针对WinForms还是WPF?WinForms,但如果真的有必要,我可以切换到WPF。我在评论中写道,因为这不是您期望的答案,只是一个替代方案的建议。为什么没有一个控件可以包含任何大小的图像,但上面有一个50px x 50px的视口?然后用户可以拖动视口。您可以对视口中的任何内容进行屏幕截图。我认为这比获取整个显示器上显示的内容更容易。只需制作整个屏幕的屏幕截图,并在最大化的无边框窗口中显示。这是WinForms还是WPF?WinForms,但如果真的有必要,我可以切换到WPF。我在评论中写道,因为这不是您期望的答案,但这只是一个替代方案的建议。为什么没有一个控件可以包含任何大小的图像,但上面有一个50px x 50px的视口?然后用户可以拖动视口。您可以对视口中的任何内容进行屏幕截图。我认为这比从整体上获取显示器上显示的内容更容易。只需制作整个屏幕的屏幕截图,并在最大化的无边框窗口中显示即可。这很有效。好的,鼠标向下,移动和向上,以及捕捉的部分。我能够在屏幕上画画并擦除它,但一切都开始闪烁,它只是看起来不像我想要的。我只是暂时忘了…它成功了。好的,鼠标向下,移动和向上,以及捕捉的部分。我能够在屏幕上画画并擦除它,但一切都开始闪烁,它只是看起来不像我想要的。我只是暂时忘了。。。