업무관련이라서 정확한 요구사항을 이 포스팅에 포함하지는 못합니다만, 구현단계에서 해야 할 일로 변환하면 "마우스 커서가 윈도우 영역 밖에 있을 때에도 마우스 커서의 움직임을 트래킹"할 필요가 생겼습니다.

조금만 Windows 프로그래밍에 경험이 있으신 분이라면 반사적으로 SetCapture를 떠올리실 겁니다. 네, 저도 그랬습니다.

문제는 이번에는 조금 다른 조건이 붙어있었다는 것이지요. "마우스 버튼이 눌리지 않은 상태에서". 저는 그 심각성을 깨닫지 못하고, 반일 동안 구현 & 테스팅 & 디버깅했고, 결국 동작하지 않아서 또 다시 반일 동안 구글링하게 되었습니다. 토호호.

[REF] Notes on SetCapture and MouseTrackEvent

결론은 SetCapture를 해도 마우스 버튼이 눌려있어야 메시지가 날아온다는 것이더군요. 이제까지 제 경험에서는 마우스 커서가 윈도우 영역 밖으로 나갔을 때 위치가 필요한 것은 드래그 중인(= 마우스 버튼이 눌려있는) 상황 밖에 없었기 때문에 SetCapture의 정확한 동작을 모르고 살고 있었던 것이지요.

뒤늦게 MSDN을 찾아보았더니
SetCapture captures mouse input either when the mouse is over the capturing window, or when the mouse button was pressed while the mouse was over the capturing window and the button is still down.

라고 잘 적혀있네요. WM_MOUSEMOVE 설명에도 좀 적어주지... 크흑.

PS. 덤으로 불평하자면 WM_MOUSELEAVE에서 아무리 윈도우 밖이라지만 좌표 좀 정확한 걸 주면 좋을텐데요. 뭐 WM_MOUSELEAVE 받은 시점에서 GetCursorPos 해서 구하면 되기는 합니다만.
top