你的問題很有意思。當你使用無限循環時,你的表單永遠不會被更新(也可能是你的文本框)。但是,如果添加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
所以這是你的整個程序?如果消息框顯示textBox1更新?您是否已經嘗試在睡眠行上添加斷點並檢查cursorPosition的值? – MetaColon
那就是button_Click代碼。是的,如果顯示messageBox textBox1更新。已經嘗試和Cursor.Position讀取正確的值問題是寫入文本框。 –
您應該只訂閱表單或面板上的MouseMove事件,並從那裏更新文本框 –