でマウスカーソルの位置を取得できるように、キーボードカーソル(キャレット)の現在の位置の座標をグローバルに取得する方法はありますmouseLocation
か?
3 に答える
いいえ、グローバルに行う方法はありません。
NSTextView のように、独自のアプリで実行する場合は、次のようにします。
NSRange range = [textView selectedRange];
NSRange newRange = [[textView layoutManager] glyphRangeForCharacterRange:range actualCharacterRange:NULL];
NSRect rect = [[textView layoutManager] boundingRectForGlyphRange:newRange inTextContainer:[textView textContainer]];
rect は、選択されたテキストの rect になります。または、挿入ポイントだけがあり、選択範囲がない場合、rect.origin は挿入ポイントのビュー相対位置です。
これは、macOS 10.0 以降で簡単に実行できます。
の場合NSTextView
、メソッドをオーバーライドしますdrawInsertionPointInRect:color:turnedOn:
。ウィンドウに対するキャレットの位置を移動するには、convertPoint:toView:
メソッドを使用します。最後に、変換された位置をインスタンス変数に格納できます。
@interface MyTextView : NSTextView
@end
@implementation MyTextView
{
NSPoint _caretPositionInWindow;
}
- (void)drawInsertionPointInRect:(CGRect)rect color:(NSColor *)color turnedOn:(BOOL)flag
{
[super drawInsertionPointInRect:rect color:color turnedOn:flag];
_caretPositionInWindow = [self convertPoint:rect.origin toView:nil];
}
@end
最も近い方法は、OS X のアクセシビリティ プロトコルを使用することです。これは、障害のあるユーザーがコンピューターを操作できるようにすることを目的としていますが、多くのアプリケーションはそれをサポートしていないか、あまりサポートしていません。
手順は次のようになります。
appRef = AXUIElementCreateApplication(appPID);
focusElemRef = AXUIElementCopyAttributeValue(appRef,kAXFocusedUIElementAttribute, &theValue)
AXUIElementCopyAttributeValue(focusElemRef, kAXSelectedTextRangeAttribute, &selRangeValue);
AXUIElementCopyParameterizedAttributeValue(focusElemRef, kAXBoundsForRangeParameterizedAttribute, adjSelRangeValue, &boundsValue);
プロトコルのサポートがむらがあるため、多くのアプリケーションではFocusedUIElementAttribute
このステップを超えることはありませんが、これは一部のアプリケーションでは機能します。