1

Objective-Cを使用して、UI要素の外側のパスに沿ってMacカーソルの位置を移動しようとしています(一部のウィンドウだけでなく、マウスが何にカーソルを合わせているかに関係なく、画面全体を移動します)。マウスをある位置に直接ワープしたくはありませんが、マウスを徐々にそこに移動します(つまり、ループを繰り返し、各反復でカーソルを1ピクセル右に移動します)。

問題は、カーソルが画面の水平方向の中心線上を常に前後にジャンプすることです(カーソルをy = 289で開始すると、y = 511にジャンプし、次にy=289に戻ります。画面の高さは800ピクセルです)実際にどこにも移動しなくても。

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

上記のコードは、マウスを現在の位置に効果的にワープしますが、何らかの理由で、カーソルが水平方向の中心線上を前後にジャンプします。それを修正するためになぜまたは何ができるかについての考えはありますか?

4

1 に答える 1

2

問題は、AppKit(NSEventクラスを提供する)とQuartz Display Services(提供するCGWarpMouseCursorPosition)が画面に異なる座標系を使用することです。

Quartzでは、画面座標系の原点はメニューバーを含む画面である「メイン」画面の左上隅にあり、画面をに移動するとY座標が増加します。

AppKitでは、画面座標系の原点はメイン画面の左下隅にあり、画面を上に移動するとY座標が増加します。

したがって、AppKitにマウスの位置(画面座標)を要求する場合は、Quartz関数に渡す前に、Y座標をQuartz座標系に変換する必要があります。

Y座標を変換するには、メイン画面の高さからY座標を引くだけです。

NSPoint point = [NSEvent mouseLocation];
point.y = [NSScreen mainScreen].frame.size.height - point.y;
CGWarpMouseCursorPosition(point);
于 2013-01-09T05:31:27.567 に答える