根据给定的坐标

时间:2018-04-25 06:08:42

标签: c# .net mouseevent mouse

我想要的是,在记录鼠标移动并保存坐标/索引/位置后,我将必须加载鼠标坐标并根据加载的坐标使鼠标移动 我没有代码向您展示,因为我陷入了困境

     ' private void button3_Click_1(object sender, EventArgs e)
        {
            StreamWriter writer;
            SaveFileDialog saveFileDialog1 = new SaveFileDialog();
            string[] cvsArray = new string[10000];
            saveFileDialog1.Filter = "All files (*.All)|*.All|All files (*.*)|*.*";

            if (saveFileDialog1.ShowDialog() == DialogResult.OK)
            {
                writer = File.CreateText(saveFileDialog1.FileName);
                // if ((myStream = saveFileDialog1.OpenFile()) != null)
                //{
                for (int i = 0; i < cvsArray.Length; i++)
                {
                    string text = richTextBox1.Text;
                    writer.WriteLine(text);
                }
                // Code to write the stream goes here.
                writer.Close();
                //}
            }
        }
 private void button11_Click(object sender, EventArgs e)
        {
            StreamReader reader;
            string Line;
            string[] cvsArray;
            string position;

            //set the filter to dialog control
            openFileDialog1.Filter = FILTER;
            //check if the user selected the right file
            if (openFileDialog1.ShowDialog() == DialogResult.OK)
            {
                //open the selected file
                reader = File.OpenText(openFileDialog1.FileName);
                //Read the entireline form the file
                Line = reader.ReadLine();
                //read while it is still not the end of the file 
                while (!reader.EndOfStream)
                {
                    Line = reader.ReadLine();
                    //Splite the line using array
                    cvsArray = Line.Split(':');

                    position = cvsArray[0];
                    //position = cvsArray[1];
                    listBox1.Items.Add(position);
                }
            }
        }'

1 个答案:

答案 0 :(得分:1)

这是一个快速且相当脏的解决方案:

让我们从几个变量开始:

 List<Point> points = null;
 Timer tt = null;
 int index = 0;

现在是一个开始重新编码的按钮;它初始化List<Point>以收集位置,并创建并启动Timer以及lambda代码,以便在Timer.Tick事件中进行重新编码:

private void btn_Record_Click(object sender, EventArgs e)
{
    points = new List<Point>();
    index = 0;
    tt = new Timer()
    { Interval = 50, Enabled = true };
    tt.Tick += (ss, ee) => 
    {
        if (!points.Any() || points.Last() != Control.MousePosition) 
           points.Add(Control.MousePosition); 
    };
}

接下来停止录制的按钮:

private void btn_Stop_Click(object sender, EventArgs e)
{
    if (tt!=null) tt.Stop();
}

最后重播按钮;它使用索引在新的Timer.Tick代码中循环遍历points集合,但使用相同的计时器:

private void btn_Replay_Click(object sender, EventArgs e)
{
    index = 0;
    tt = new Timer() { Interval = 50, Enabled = true };
    tt.Tick += (ss, ee) =>
    {
        if (index < points.Count)
          { System.Windows.Forms.Cursor.Position =  points[index++]; }
        else tt.Stop();
}

一些注意事项:

  • 正如问题所述,这将记录并回复Mmouse协调员。它将以固定的间隔进行,因此播放看起来与原始动作非常相似;事实上,我很难分辨出我添加了一个较长间​​隔的slowmo按钮来演示......(但是gif太大了)

  • 代码会在屏幕坐标中记录鼠标位置,并且应该在任何地方捕获它们,而不仅仅是在应用程序内部。了解VS如何激活代码放大镜!

  • 它不会记录任何其他鼠标事件,例如上,下,点击,双击或滚轮。对于那些你需要一个全局鼠标钩子来捕获和一些外部调用来重放。

  • 要包含其他鼠标事件,您还需要一个不同的扩展数据结构;你还必须从计时器驱动的模型转到鼠标事件驱动模型。

  • 该示例使用按钮启动和停止。当然,进出这些按钮的动作都包含在记录的职位列表中。相反,人们可以使用定时开始,几秒后开始录制,并在几秒钟不活动后停止录制。

有多种方法可以保存和加载积分;最简单的是序列化为xml;使用string path = @"..."它可能看起来很简单:

private void btn_save_Click(object sender, EventArgs e)
{
    if (points == null) points = new List<Point>();
    XmlSerializer xs = new XmlSerializer((points).GetType());
    using (TextReader tr = new StreamReader(path))
    {
        points =  (List<Point>)xs.Deserialize(tr);
        tr.Close();
    }
}

private void btn_load_Click(object sender, EventArgs e)
{
    XmlSerializer xs = new XmlSerializer((points).GetType());
    using (TextWriter tw = new StreamWriter(path))
    {
        xs.Serialize(tw, points);
        tw.Close();
    }
}

其他方式是使用二进制格式化程序或自定义转换例程。 Xml相对稳定。

这是一个简短的剪辑:

enter image description here