2017-04-21 5 views
1

내가하고 싶은 모든이 간단한 코드TextBox.text에만 메시지 박스 뒤에 워킹

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

으로 현재 마우스 위치의 X 및 Y 값을 평가하는 것입니다하지만 경우에만 메시지 박스를 작동하는 것 같다 주석 처리되지 않은 경우에는 아무 것도 쓰지 않습니다.

커서를 Panel.Handle로 초기화하면 .position 멤버가 표시되지 않습니다.

+0

전체 프로그램입니까? 그리고 메시지 상자가 표시되면 textBox1이 업데이트됩니까? Sleep 행에 중단 점을 추가하고 cursorPosition의 값을 확인하려고 이미 시도 했습니까? – MetaColon

+0

그게 button_Click 코드. 예, messageBox1이 업데이트 된 것으로 표시되면 messageBox1이 표시됩니다. 이미 시도하고 Cursor.Position은 문제가 텍스트 상자에 쓰는 올바른 값을 읽습니다. –

+0

폼이나 패널에서 MouseMove 이벤트를 구독하고 –

답변

2

문제는 매우 흥미 롭습니다. 무한 루프를 사용하면 양식이 업데이트되지 않습니다 (텍스트 상자가됩니다). 그러나 messageBox를 추가하면 messageBox가 표시되면 양식이 업데이트 된 것처럼 보입니다.

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(); 
} 

당신은 일반적으로에 무한 루프를 사용하지 않아야합니다 : 당신은 타이머를 사용하여 동일한을 달성 할 수

Task.Run(async() => await Task.Run(() => 
    { 
     while (true) 
     { 
      textBox1.Invoke(new Action(() => textBox1.Text = Cursor.Position.X.ToString())); 
      Thread.Sleep(150); 
     } 
    })); 

: 그래서 당신이해야 할 모든 비동기 상황에 무한 루프를 넣어하는 것입니다 그렇지 않으면 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