2017-04-21 37 views
1

所有我想要做的就是這個簡單的代碼TextBox.text唯一的工作,隨後一個MessageBox

while (true) 
      { 
       textBox1.Text = Cursor.Position.X.ToString(); 
       //MessageBox.Show(""+Cursor.Position); 
       Thread.Sleep(150); 
      } 

,以評估當前鼠標位置的X和Y值,但它只是似乎工作時的MessageBox沒有註釋,否則它只是什麼都不寫。

如果我用Panel.Handle初始化Cursor,它不會顯示.position成員;

+0

所以這是你的整個程序?如果消息框顯示textBox1更新?您是否已經嘗試在睡眠行上添加斷點並檢查cursorPosition的值? – MetaColon

+0

那就是button_Click代碼。是的,如果顯示messageBox textBox1更新。已經嘗試和Cursor.Position讀取正確的值問題是寫入文本框。 –

+0

您應該只訂閱表單或面板上的MouseMove事件,並從那裏更新文本框 –

回答

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

+0

...或計時器。 – LarsTech

+0

但我不認爲這是比第二個更好的解決方案,所以我不認爲這是值得一提的。 – MetaColon

+0

我沒說什麼好。只需添加到你的清單。如果鼠標移過一個控件,窗體的MouseMove事件將不會觸發。 – LarsTech