2

でマウスカーソルの位置を取得できるように、キーボードカーソル(キャレット)の現在の位置の座標をグローバルに取得する方法はありますmouseLocationか?

4

3 に答える 3

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 は挿入ポイントのビュー相対位置です。

于 2013-10-17T23:00:38.580 に答える
1

これは、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
于 2019-02-24T13:01:49.117 に答える
0

最も近い方法は、OS X のアクセシビリティ プロトコルを使用することです。これは、障害のあるユーザーがコンピューターを操作できるようにすることを目的としていますが、多くのアプリケーションはそれをサポートしていないか、あまりサポートしていません。

手順は次のようになります。

appRef = AXUIElementCreateApplication(appPID);
focusElemRef = AXUIElementCopyAttributeValue(appRef,kAXFocusedUIElementAttribute, &theValue)
AXUIElementCopyAttributeValue(focusElemRef, kAXSelectedTextRangeAttribute, &selRangeValue);
AXUIElementCopyParameterizedAttributeValue(focusElemRef, kAXBoundsForRangeParameterizedAttribute, adjSelRangeValue, &boundsValue);

プロトコルのサポートがむらがあるため、多くのアプリケーションではFocusedUIElementAttributeこのステップを超えることはありませんが、これは一部のアプリケーションでは機能します。

于 2013-10-18T17:02:24.003 に答える