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.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 回答