从基于Cocoa的应用程序获取文本插入位置

时间:2016-02-11 07:28:49

标签: objective-c shell cocoa applescript

我有一个基于Cocoa的应用程序,在ScrollArea'内有一个画布。你可以在哪里输入文字。我需要从此应用程序获取文本插入位置(将键入下一个文本的位置)。请记住,我不在应用程序中,即我无法访问此应用程序的代码。我基本上在这个应用程序上自动执行一些黑盒测试。我可以使用Objective-c,外部应用程序,AppleScript,shell脚本,任何东西。 This is what the Accessibility Inspector panel looks like at my current position

我试图使用它,但它不起作用,因为我的应用程序中的画布不是文本区域,它是滚动视图:

    AXUIElementRef systemWideElement = AXUIElementCreateSystemWide();
    AXUIElementRef focussedElement = NULL;
    AXError error = AXUIElementCopyAttributeValue(systemWideElement,                kAXFocusedUIElementAttribute, (CFTypeRef *)&focussedElement);
    if (error != kAXErrorSuccess) {
NSLog(@"Could not get focussed element");
    } else {
        AXValueRef selectedRangeValue = NULL;
        AXError getSelectedRangeError =     AXUIElementCopyAttributeValue(focussedElement,   kAXSelectedTextRangeAttribute, (CFTypeRef *)&selectedRangeValue);
        if (getSelectedRangeError == kAXErrorSuccess) {
            CFRange selectedRange;
            AXValueGetValue(selectedRangeValue, kAXValueCFRangeType, &selectedRange);
            AXValueRef selectionBoundsValue = NULL;
            AXError getSelectionBoundsError =     AXUIElementCopyParameterizedAttributeValue(focussedElement, kAXBoundsForRangeParameterizedAttribute, selectedRangeValue, (CFTypeRef *)&selectionBoundsValue);
            CFRelease(selectedRangeValue);
            if (getSelectionBoundsError == kAXErrorSuccess) {
                CGRect selectionBounds;
                AXValueGetValue(selectionBoundsValue, kAXValueCGRectType, &selectionBounds);
                NSLog(@"Selection bounds: %@", NSStringFromRect(NSRectFromCGRect(selectionBounds)));
            } else {
                NSLog(@"Could not get bounds for selected range");
            }
            if (selectionBoundsValue != NULL)   CFRelease(selectionBoundsValue);
        } else {
            NSLog(@"Could not get selected range");
        }
    }
    if (focussedElement != NULL) CFRelease(focussedElement);
    CFRelease(systemWideElement);

请提出别的建议。

0 个答案:

没有答案