2013-05-16 2 views
1

mouse_event을 호출 할 때 마우스 좌표를 지정하는 데 어려움이있는 것 같습니다. 아무리 설정해도 마우스가 제대로 움직이지 않는 것처럼 보일 수 있습니다. 그러면 마우스가 왼쪽 위 또는 오른쪽 하단으로 만 이동합니다. pWnd은 내가 원하는 시점에서 바라는 컨트롤에 대한 포인터입니다. 현재 좌표계를 계산하려고합니다.mouse_event 좌표를 클릭하십시오. 좌표 세트에서 길을 잃은 것 같습니다.

마우스가 제대로 움직이는 이유는 무엇입니까? 윈도우 화소에 대응하지 않는 mouse_event 의해 사용

pWnd->GetWindowRect(&wndRect); 

     POINT lpPoint = POINT(); 
     lpPoint.x = wndRect.left; 
     lpPoint.y = wndRect.top; 

     ScreenToClient(mainFrm->GetSafeHwnd(), &lpPoint); 

     mouse_event(MOUSEEVENTF_MOVE | MOUSEEVENTF_ABSOLUTE , (DWORD)lpPoint.x, (DWORD)lpPoint.y, 0, 0); 

답변

3

좌표는 그들이 기본 모니터 0 ~ 65535의 범위에 매핑. MOUSEINPUT structure 문서에서 인용 : MOUSEEVENTF_ABSOLUTE 값이 지정

경우 dxdy 0과 65,535 사이의 정규화 된 절대 좌표를 포함한다. 이벤트 프로시 저는이 좌표를 디스플레이 표면에 매핑합니다. 좌표 (0,0)는 디스플레이 표면의 왼쪽 위 모서리에 매핑됩니다. 좌표 (65535,65535)는 오른쪽 아래 모서리에 매핑됩니다. 다중 모니터 시스템에서 좌표는 기본 모니터에 맵핑됩니다.

이렇게하면 창 좌표를이 특수 범위로 변환해야합니다. 나는 정의 기본 모니터의 좌표는 (0,0)라고 생각하기 때문에

DWORD dx = muldiv(x - rectPrimaryMonitor.left, 65535, rectPrimaryMonitor.Width()); 
DWORD dy = muldiv(y - rectPrimaryMonitor.top, 65535, rectPrimaryMonitor.Height()); 

당신은 방정식에서 lefttop을 제거 할 수 있습니다.

DWORD은 서명이 없으므로 모니터가 위 또는 왼쪽의 기본 모니터에있는 경우 어떻게 작동하는지 알 수 없습니다.

+0

그래서 화면의 크기를 픽셀 단위로 가져와야합니다. 그런 다음 'wndRect.top/pixelHeightMax' * 65535'를 실행하여 Y? 좋아, 마크, 감사합니다! 다시 미안; 나는 2 일을 기다려서 현상금을 시작하고 너의 길을 보낼거야! –

+0

@ BumSkeeter, 먼저이 솔루션을 사용해보고 작동하는지 확인하십시오. 또한 생각에 감사드립니다. 그러나 나는 현상금이 정말로 필요하지 않습니다. –

관련 문제