如何在Mac OSX应用程序(如OSK)上的另一个应用程序的光标位置插入文本?

时间:2013-04-29 06:47:14

标签: macos cocoa on-screen-keyboard

我正在尝试创建一个OSX应用程序,它将是On Screen键盘的副本。是否可以将一些文本插入另一个活动应用程序的光标位置?提前谢谢!

2 个答案:

答案 0 :(得分:5)

有可能。辅助功能可以更改其他应用程序的内容,但您的应用程序无法进行沙盒处理,因此无法通过AppStore获取。

CFTypeRef focusedUI;
AXUIElementCopyAttributeValue(AXUIElementCreateSystemWide(), kAXFocusedUIElementAttribute, &focusedUI);

if (focusedUI) {
    CFTypeRef textValue, textRange;
    // get text content and range
    AXUIElementCopyAttributeValue(focusedUI, kAXValueAttribute, &textValue);
    AXUIElementCopyAttributeValue(focusedUI, kAXSelectedTextRangeAttribute, &textRange);

    NSRange range;
    AXValueGetValue(textRange, kAXValueCFRangeType, &range);
    // replace current range with new text
    NSString *newTextValue = [(__bridge NSString *)textValue stringByReplacingCharactersInRange:range withString:newText];
    AXUIElementSetAttributeValue(focusedUI, kAXValueAttribute, (__bridge CFStringRef)newTextValue);
    // set cursor to correct position
    range.length = 0;
    range.location += text.length;
    AXValueRef valueRef = AXValueCreate(kAXValueCFRangeType, (const void *)&range);
    AXUIElementSetAttributeValue(focusedUI, kAXSelectedTextRangeAttribute, valueRef);

    CFRelease(textValue);
    CFRelease(textRange);
    CFRelease(focusedUI);
}

此代码不检查错误,并假设聚焦元素是文本区域。

答案 1 :(得分:1)

不确定这是否有帮助,但在Applescript中您可以执行类似

的操作
tell application "System Events"
    keystroke "Stuff here"
end tell

所以也许你可以尝试使用NSApplescript或使用NSTask在cocoa中调用它并运行

osascript -e 'tell application "System Events" to keystroke "Stuff here"'