C# TextBox.text-only-working后跟Messagebox
我只想用这个简单的代码计算当前鼠标位置的X和Y值C# TextBox.text-only-working后跟Messagebox,c#,string,winforms,textbox,messagebox,C#,String,Winforms,Textbox,Messagebox,我只想用这个简单的代码计算当前鼠标位置的X和Y值 while (true) { textBox1.Text = Cursor.Position.X.ToString(); //MessageBox.Show(""+Cursor.Position); Thread.Sleep(150); } 但它似乎只有在MessageBox未注释时才起作用,否则它什
while (true)
{
textBox1.Text = Cursor.Position.X.ToString();
//MessageBox.Show(""+Cursor.Position);
Thread.Sleep(150);
}
但它似乎只有在MessageBox未注释时才起作用,否则它什么也不写
如果我使用面板.Handle初始化游标,它不会显示.position成员 你的问题很有趣。由于您使用的是无止境的循环,因此您的表单永远不会被更新(或者是您的文本框)。但是如果添加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元素的线程之外的其他线程上访问UI元素
但是,解决此问题的更优雅的方法是处理MouseMove
事件:
private void Form1_MouseMove(object sender, MouseEventArgs e)
{
textBox1.Text = $"Mouse location: {e.Location.X}, {e.Location.Y}";
}
我还改变了位置的显示方式(我使用了一个插值字符串),因为我认为这更漂亮
有关异步编程的更多信息,请查看以下内容:这就是您的整个程序?如果显示消息框,文本框1是否会更新?您是否已尝试在睡眠行上添加断点并检查光标位置的值?这是按钮单击代码。是,如果显示消息框,则更新文本框1。已经尝试过,游标。Position读取正确的值。问题是将其写入textbox。您只需订阅窗体或面板上的MouseMove事件,然后从那里更新textbox。。。或者一个计时器。但我不认为这是比第二个更好的解决方案,所以我认为在这方面不值得一提。我没有说更好的。只是添加到您的列表中。如果鼠标移动到控件上,窗体的MouseMove事件将不会触发。