2013-04-29 2 views
2

Я пытаюсь создать приложение OSX, которое будет копией экранной клавиатуры. Можно ли вставить какой-либо текст в позицию курсора другого активного приложения? Заранее спасибо!Как вставить текст в позицию курсора другого приложения в приложении Mac OSX (например, OSK)?

+1

FYI, на всякий случай: ответ (независимо от деталей, извините, что я не знаю их из рук в руки) является * квалифицированным * да - как, например, как работает вспомогательное программное обеспечение. * Однако * под песочницей и, следовательно, в App Store, общий ответ, безусловно, нет - ввод в другое приложение потенциально является серьезной проблемой безопасности. Конечно, если ваше приложение не будет в песочнице, тогда его ограничения не будут иметь значения. – CRD

+0

@CRD Что вы подразумеваете под песочницей. Вы имеете в виду, что если я отправлю приложение в appstore, он не будет работать? Но как разработчик Apple, я мог бы запустить это приложение в своей системе? Не могли бы вы рассказать ... Спасибо. – Selvin

+1

App Sandbox - это система безопасности, которая ограничивает возможности приложения - какие файлы он может получить, может ли он делать сетевые подключения и т. Д. И т. Д. Все приложения для iOS изолированы, а для OS X они являются необязательными. Однако все приложения, которые будут продаваться в Mac App Store, должны быть изолированы. Посмотрите приложение Sandbox в документах Apple для деталей. – CRD

ответ

1

Не уверен, если это поможет, но в Applescript вы можете сделать что-то вроде

tell application "System Events" 
    keystroke "Stuff here" 
end tell 

Так может быть, вы можете попробовать позвонить, что в какао с использованием NSApplescript или с помощью NSTask и запустить

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

Это тоже не работает в Mac App Store, поэтому вам лучше всего это разъяснить. – SevenBits

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); 
} 

Этот код не проверяет наличие ошибок и делает предположение, что сфокусированный элемент является текстовой областью.

Смежные вопросы