2013-10-07 2 views
1

MouseMove 이벤트를 처리하여 두 개의 NumericUpDowns을 현재 마우스 좌표로 업데이트하는 사용자 지정 컨트롤이 있습니다.WinForms의 "Ghost"MouseMove 이벤트

그러나 이상한 경우에는 MouseMove 이벤트가 발생하지 않아도됩니다 (무선 마우스를 끄고 트랙 패드를 비활성화 함). 따라서 마우스가 움직이지 않아도 MouseMove이 발생합니다.

간단한 점검을하고 "고스트"MouseMove 이벤트 사이에서 마우스 포인터의 위치가 변경되지 않았 음을 확인했습니다. 필자는이 점을 이용하여 포인터를 실제로 움직였을 때만 이벤트를 처리하는 메서드가 호출되도록하여 응용 프로그램의 요구 사항을 충족시킬 수 있었는지 확인했습니다.

그러나 모든 마우스/트랙 패드가 비활성화되었을 때 MouseMove 이벤트를 실행할 수있는 것이 무엇인지 이해하지 못하기 때문에 여전히 의문입니다. Visual Studio에서 호출 스택을 보면 마우스가 실제로 움직이는 것처럼 응용 프로그램의 다른 부분 (예 : 응용 프로그램의 일부를 시뮬레이트하는 것처럼) 에서처럼 MouseMove 이벤트의 실행이 "정품"이라고 생각됩니다. MouseMove).

이유에 대한 의견이 있으면 알려주세요. 고맙습니다!

EDIT : King King의 제안에 따라 MouseMove에 대한 메시지가 감지 될 때마다 문자열을 인쇄하도록 코드를 수정했습니다. 마우스가 꺼져 있고 포인터가 컨트롤을 가리키면 Alt-Tab을 사용하여 응용 프로그램간에 전환 할 때 문자열이 인쇄됩니다. 아마도 이것은 다시 그려지는 응용 프로그램과 관련이 있습니까?

+0

실제 MouseMove가 있는지 확인하려면 'WndProc'을 재정의하고이 코드를 추가하십시오. if (m.Msg == 0x200) System.Diagnostics.Debug.Print ("Mouse MOVE !!!!!!! !!! ");', 나는'Mouse MOVE !!!!! ... '가 인쇄되지 않을 것이라고 생각한다. –

+0

제안에 감사드립니다. 불행히도 "Mouse MOVE !!!!!" 인쇄됩니다. 아무 것도하지 않으면 아무 것도 인쇄되지 않습니다. 그러나 Alt-Tab (Windows 7)을 사용하여 응용 프로그램간에 전환 할 때 "Mouse MOVE !!!!!" 몇 번 인쇄됩니다. 마우스를 가리키면 컨트롤을 가리키고있을 때에 만 나타납니다. 어떤 이유에서 창이 다시 그려지는 것이 원인 일 수 있습니까? – elnigno

+0

두 가지 아이디어 : [A] 터치 스크린 장비가 있습니까? 윈도우 7에서 마우스 움직임으로보고되고 때로는 필터링해야합니다. [B]는 화면 좌표 또는 앱 협동 조합에 연결된 업다운입니다. 아마 그렇지는 않지만 어쩌면 앱 협동 조합의 공동 변경이 효과가있을 것인가? – n4m16

답변

2

Windows 가끔 가짜 WM_MOUSEMOVE 메시지를 합성합니다. 이것은 특히 하나의 창에서 다른 창으로의 포커스 변경시 발생합니다. 포커스를 얻는 창에도 이동 메시지가 표시됩니다. Alt + Tab을 사용할 때 이런 현상이 발생하는 것은 이것이 실제로 메시지의 출처라는 탁월한 단서입니다.

이것은 모두 의도적입니다. WM_MOUSEMOVE에 의해 트리거 된 다른 메시지 열이 발생합니다. 특히 WM_NCHITTEST와 WM_SETCURSOR. 올바른 마우스 커서 모양이 표시됩니다. 그렇지 않으면 Control.Cursor 및 Application.UseWaitCursor 속성에 의해 Winforms에서 영향을받습니다.

당신은 이것으로 살아야 할 것입니다, 이것이 결코 문제가되지 않는지 확인하십시오.

+1

"그렇지 않으면 Control.Cursor 및 Application.UseWaitCursor 속성에 의해 Winforms가 영향을받습니다." 그건 나에게 의미가 없다. 여기서 해결책을 제시하고 있습니까? – Prof