我想做的就是用这个简单的代码评估当前鼠标位置的X和Y值
while (true)
{
textBox1.Text = Cursor.Position.X.ToString();
//MessageBox.Show(""+Cursor.Position);
Thread.Sleep(150);
}
但它似乎只在取消注释MessageBox时起作用,否则它只会写入任何内容。
如果我使用Panel.Handle初始化Cursor,它不会显示.position成员;
答案 0 :(得分:2)
你的问题非常有趣。当您使用无限循环时,您的表单永远不会更新(也可能是您的文本框)。但是如果你添加了messageBox,如果显示了messageBox,似乎表单就更新了。因此,您所要做的就是将无限循环置于异步上下文中:
Task.Run(async () => await Task.Run(() =>
{
while (true)
{
textBox1.Invoke(new Action(() => textBox1.Text = Cursor.Position.X.ToString()));
Thread.Sleep(150);
}
}));
您可以使用计时器实现相同的目标:
public Form1()
{
InitializeComponent();
var timer1 = new Timer
{
Enabled = true,
Interval = 150
};
timer1.Tick += timer1_Tick;
timer1.Start();
}
private void timer1_Tick(object sender, EventArgs e)
{
textBox1.Text = Cursor.Position.X.ToString();
}
您通常不应在表单应用程序的主线程上使用无限循环,否则您的UI会冻结。实际上你可能会注意到我使用了textBox1.Invoke
- 这就是因为你无法访问另一个线程上的UI元素而不是它们的创建。
然而,更优雅的解决方法是处理MouseMove
事件:
private void Form1_MouseMove(object sender, MouseEventArgs e)
{
textBox1.Text = $"Mouse location: {e.Location.X}, {e.Location.Y}";
}
我也改变了位置的显示方式(我使用了插值字符串),因为我觉得这样更漂亮。
有关异步编程的更多信息,请查看:https://msdn.microsoft.com/de-de/library/mt674882.aspx