2013-01-09 143 views
0

我試圖移動Mac遊標沿任何UI元素之外的路徑使用Objective-C的位置(不只是在某個窗口上,而是圍繞整個屏幕與鼠標懸停在上面無關)。我不想直接將鼠標移動到某個位置,而是逐漸移動它(即循環遍歷一個循環,並在每次迭代中將光標向右移動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鼠標的位置(屏幕座標),你需要將Y座標轉換爲Quartz座標系,然後再傳遞給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]'。 –