2013-01-09 4 views
0

Objective-C를 사용하여 Mac 커서의 위치를 ​​UI 요소 외부의 경로를 따라 이동하려고합니다 (일부 창뿐만 아니라 마우스가 움직이는 것과 관련없는 전체 화면 주위에서).). 마우스를 위치에 직접 비틀어 놓고 싶지는 않지만 점진적으로 점프 (즉 루프를 반복하고 각 반복에서 커서를 오른쪽으로 1 픽셀 이동)합니다.뒤틀린 커서가 튀어 오름

문제는 커서가 화면의 수평 중심선을 따라 계속해서 앞뒤로 이동한다는 것입니다. 커서가 y = 289에서 시작하고 y = 511로 점프 한 다음 y = 289로 돌아 가면 등등, 내 스크린은 800 픽셀 높이입니다.) 실제로 아무데도 움직이지 않아도 마찬가지입니다.

NSPoint mPoint = [NSEvent mouseLocation]; 
NSPoint mouseWarpLocation = NSMakePoint(mPoint.x, mPoint.y); 
CGWarpMouseCursorPosition(mouseWarpLocation); 

위 코드는 마우스를 현재 위치로 효과적으로 왜곡하지만 어떤 이유로 커서가 수평 중심선 위로 앞뒤로 이동합니다. 왜 또는 내가 그것을 고칠 수있는 일에 관한 어떤 생각?

+0

당신은 한 번 또는 두 번 이상 커서를 포장하고 있습니까? – TheAmateurProgrammer

+0

@TheAmateurProgrammer 필자는 끊임없이 뒤틀리고있다. 코드는 초당 20 회 호출되는 함수에있다. –

답변

2

문제는 AppKit (NSEvent 클래스 제공)과 Quartz Display Services (CGWarpMouseCursorPosition 제공)가 화면에 다른 좌표계를 사용한다는 것입니다. 석영에서

, 화면 좌표계의 원점은 메뉴 모음이 들어있는 화면이며, 당신이 아래로이동에 따라 Y가 증가 좌표 "기본"화면의 왼쪽 상단 코너에있다 화면. AppKit의에서

, 화면의 원점 좌표 시스템은 메인 화면의 왼쪽 아래 코너에, 당신은 화면까지 이동에 따라 Y는 증가를 조정합니다.

그래서 화면 위치에서 마우스 위치를 AppKit에 요청하면 Quartz 함수로 전달하기 전에 Y 좌표를 Quartz 좌표계로 변환해야합니다.

는 Y 좌표 변환하려면 단순히 메인 화면의 높이에서 빼기 :

NSPoint point = [NSEvent mouseLocation]; 
point.y = [NSScreen mainScreen].frame.size.height - point.y; 
CGWarpMouseCursorPosition(point); 
+0

'[NSScreen mainScreen]'실제로 10.8까지 미묘하게 다릅니다. 그것은 메인 윈도우가 위치한 스크린이며 반드시 메인 메뉴가 위치한 스크린이 아닙니다. 당신이 대답 할 때 말하는 화면은'[NSScreen screens] [0]'인 주 메뉴가있는 화면입니다. –

관련 문제