无论如何都要获得全局键盘光标(插入符号)当前位置的坐标,就像使用mouseLocation
的鼠标光标位置一样?
答案 0 :(得分:2)
不,全球无法做到这一点。
如果您想在自己的应用中执行此操作,例如在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是插入点的视图相对位置。
答案 1 :(得分:0)
您可以获得的最接近的是使用OS X的辅助功能协议。这是为了帮助残疾用户操作计算机,但许多应用程序不支持它,或者不支持它。
程序如下:
appRef = AXUIElementCreateApplication(appPID);
focusElemRef = AXUIElementCopyAttributeValue(appRef,kAXFocusedUIElementAttribute, &theValue)
AXUIElementCopyAttributeValue(focusElemRef, kAXSelectedTextRangeAttribute, &selRangeValue);
AXUIElementCopyParameterizedAttributeValue(focusElemRef, kAXBoundsForRangeParameterizedAttribute, adjSelRangeValue, &boundsValue);
由于对协议的支持很多,对于许多应用程序,您不会超越FocusedUIElementAttribute
步骤,但这适用于某些应用程序。
答案 2 :(得分:0)
您可以在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