2014-03-04 2 views
2

WPF 창의 외부에서 커서 이동 이벤트를 감지하는 방법이 있습니까? 커서가 윈도우 외부로 이동했는지 알기 위해 노력하고 있지 않습니다. 마우스가 wpf 윈도우 경계 밖으로 이동하더라도 단순히 이동 이벤트에 계속 가입하려고합니다. 나는 윈도우 내에서 움직임을 다루는 많은 것들을 발견 할 수 있었지만, 그것의 바깥에는 아무것도 없었다. (실제로는 아무 것도 작동하지 않았다.) 질문은 외부 운동에 대해 질문하는 경우에도 모두 본질적으로 창 안에서만 작업했습니다.wpf 창 경계 외부의 커서 이동 이벤트

지금까지 솔루션을 찾을 수 없었기 때문에 다음 코드를 사용했습니다. 이 코드가 얼마나 효율적인 지 잘 모르겠습니다. 시스템이 이미 마우스 움직임을 검사하고 있다면 별도의 검사를 추가하는 것이 비효율적이라고 생각합니다. 그러나, 나는 그것에 대한 좋은 참조를 찾을 수 없기 때문에 나는 시스템 부분을 이용할 수 없었다.

참고 : 나는 이것을하는 기존의 방법을 찾으려고합니다. 내 코드는 제대로 작동하지만 이미 구독 할 수있는 시스템 내에서 코드를 생성하는 이벤트가있는 경우이 여분의 타이머 루프가 추가 리소스를 낭비하기 때문에 비효율적 일 수 있습니다. 마우스가 바운더리 바깥으로 움직이는 지 감지하지 않으려 고합니다. 화면에서 마우스가 움직이는 위치에 관계없이 좌표를 기록하려고합니다. 따라서 마우스가 두 번째 모니터에서 내 앱 창에서 멀리 떨어진 곳으로 이동하면 이벤트가 계속 발생하고 알림이 발생합니다. 내 타이머 구현 보고서는 항상 좌표를 지정하지만 이미 작업을 수행하는 무언가 위에 여분의 레이어를 추가하지는 않습니다. 이것은 논평 한 사람들과 내가받은 대답에 근거한 큰 혼란으로 보입니다.

public MainWindow() 
{ 
    InitializeComponent(); 
    InitializeCursorMonitoring(); 
} 

private void InitializeCursorMonitoring() 
{ 
    var point = System.Windows.Forms.Cursor.Position; 
    var timer = new System.Windows.Threading.DispatcherTimer(); 

    timer.Tick += delegate 
    { 
     if (point != System.Windows.Forms.Cursor.Position) 
     { 
      point = System.Windows.Forms.Cursor.Position; 

      System.Diagnostics.Debug.WriteLine(String.Format("X:{0} Y:{1}", 
               System.Windows.Forms.Cursor.Position.X, 
               System.Windows.Forms.Cursor.Position.Y)); 
     } 
    }; 

    timer.Interval = new TimeSpan(0, 0, 0, 0, 100); 
    timer.Start(); 
} 
+1

마우스 캡처로 시도하십시오 .. – Sankarann

+0

@Sankarann ​​좀 자세히 설명해 주시겠습니까? –

+0

보세요 ... http://stackoverflow.com/questions/942357/what-does-it-mean-to-capture-the-mouse-in-wpf –

답변

0

다른 사람이 언급했듯이 마우스를 캡처해야합니다.

private void InitializeCursorMonitoring() 
{ 
    var point = Mouse.GetPosition(Application.Current.MainWindow); 
    var timer = new System.Windows.Threading.DispatcherTimer(); 

    timer.Tick += delegate 
    { 
     Application.Current.MainWindow.CaptureMouse(); 
     if (point != Mouse.GetPosition(Application.Current.MainWindow)) 
     { 
      point = Mouse.GetPosition(Application.Current.MainWindow); 
      Console.WriteLine(String.Format("X:{0} Y:{1}", point.X, point.Y)); 
     } 
     Application.Current.MainWindow.ReleaseMouseCapture(); 
    }; 

    timer.Interval = new TimeSpan(0, 0, 0, 0, 100); 
    timer.Start(); 
} 

화면의 아무 곳이나 위치를 얻을 수있는 위치를 받고 일반 마우스 기능을 재개 한 후 그것을 해제하기 전에 마우스를 캡처 : 여기를 보여주는 코드를 기반으로 샘플입니다.

+0

당신의 코드는 창을 드래그하는 것을 막아줍니다. 마우스를 캡처하는 것이 정확히 무엇입니까? 당신은 그 언급에 실패했습니다. 본질적으로 당신이 말한 모두는 "다른 사람들이 말하는대로"하고 설명하지 않고 코드에서 쓴 것을 설명했습니다. 구현시 이미 마우스 움직임 좌표가보고되어 있으므로 코드가 어떤 방식으로 나를 돕는 지 알 수 있습니까? –

+1

얼마 전에 마우스를 캡처하면 다른 프로그램의 대기열로 보내는 대신 프로그램의 메시지 대기열에 마우스 메시지 (WM_MOUSEMOVE, WM_CLICK, WM _...)가 전송되었습니다. 분명히이 동작은 변경되었습니다 :'마우스 커서가 다른 스레드에 의해 생성 된 창 위에 있으면 마우스 버튼이 눌려져있을 때만 시스템이 마우스 입력을 지정된 창으로 보냅니다. ' 따라서 끌기에 대한 당신의 관찰 된 문제점, 나는 의심한다. – FredP

+0

@ FredP 아마도 ... –