我想要的是,在记录鼠标移动并保存坐标/索引/位置后,我将必须加载鼠标坐标并根据加载的坐标使鼠标移动 我没有代码向您展示,因为我陷入了困境
' 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);
}
}
}'
答案 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相对稳定。
这是一个简短的剪辑: