2010-04-21 4 views
7

Я прочитал около NSPasteBoard в документации Apple и о том, как он позволяет приложениям записывать в PasteBoard и разрешать другим приложениям читать этот текст и использовать его.Как вставить текст из одного приложения в другое с помощью Cocoa?

Может ли кто-нибудь сказать мне, как вставить текст из приложения am (который находится в строке состояния) в NSTextField, который находится внутри другого приложения.

То, что я пытаюсь сделать, это нечто похожее, что Snippet и SnippetsApp сделать.

Если я совершенно глупо и пропустил очевидное в Apple, Docs, не могли бы вы указать мне правильный путь :)

Спасибо!

ответ

8

Может кто-нибудь сказать мне, как вставить текст от am приложения (который находится в строке состояния) в NSTextField, который находится внутри другого приложения.

Вклеивание происходит в принимающем приложении. Запись в картон - это копирование.

Кроме того, вы не можете предположить, что пользователь захочет вставить в NSTextField. Это может быть NSTextView или текстовое поле в WebView, или Carbon EditText или MLTE, или какой-либо другой текстовый редактор, такой как текстовый редактор Qt или wxWidgets. Они могут даже использовать приложение со списком, которое позволяет им вставлять текст прямо в него.

Итак, нет программного способа напрямую сообщить приложение «вот какой текст - вставьте его, пожалуйста». Вы должны скопировать его в общий картон, а затем подделать событие, которое обычно должно привести к вставке самого последнего приложения. Предложение Чарли о «В» является одним из способов, хотя и сложным; макет Dvorak кладет V на другой ключ, в то время как макет Dvorak QWERTY layout ставит V-с-⌘ (в отличие от V-без-⌘) на ту же клавишу, что и QWERTY V.

Чтобы подделать это, событие, посмотрите на CGEventTap. Вам нужно будет использовать the CGEventCreateKeyboardEvent function для создания самого события, и поскольку эта функция принимает код ключа, вам нужно будет найти правильный код клавиши для V-части комбинации ⌘V, которая потребует пройти через Text Input Source Services или Keyboard Layout Services, в зависимости от макета.

Вы можете в этот момент подумать об использовании функции «Доступность», чтобы найти пункт меню «Вставить» в меню «Правка» и отправить ему сообщение AXPress, но «Вставить» и «Изменить» являются только словами английского для этих концепций; если вы это сделаете, ваше приложение не будет работать ни на одном другом языке. Вы можете пойти по порядку (третье меню, шестой пункт меню), но тогда ваше приложение не будет работать в приложениях без меню «Файл» или без пункта меню «Повторить» или с двумя пунктами меню «Отменить» (Photoshop). Ковка на событие ⌘V действительно - это путь.

+0

CGEventSourceRef не работает, пока я песочница моего заявления. Есть ли способ решить проблему? – iPhoneDv

+0

@iPhoneDv: вы должны задать отдельный вопрос с дополнительной информацией о том, что вы делаете, и о какой проблеме вы столкнулись. –

+0

Вот некорректная ссылка на документацию KeyboardLayoutServices: https://developer.apple.com/legacy/library/documentation/Carbon/Reference/KeyboardLayoutServices/ (Конечно, это все равно не сработает, если пользователь отключится или изменится сочетание клавиш для вставки?) – jtbandes

0

Как правило, единственный способ, чтобы записать его на NSPasteboard, а затем переключиться на другое приложение и использовать некоторые функции углерода нажать «Command-V» ...

6

Вот некоторый рабочий код, чтобы отправить ⌘ + ключевое событие (при условии известного клавиатурного):

// some common keycodes 
#define KEY_CODE_x ((CGKeyCode)7) 
#define KEY_CODE_c ((CGKeyCode)8) 
#define KEY_CODE_v ((CGKeyCode)9) 

void DCPostCommandAndKey(CGKeyCode key) 
{ 
    CGEventSourceRef source = CGEventSourceCreate(kCGEventSourceStateCombinedSessionState); 

    CGEventRef keyDown = CGEventCreateKeyboardEvent(source, key, TRUE); 
    CGEventSetFlags(keyDown, kCGEventFlagMaskCommand); 
    CGEventRef keyUp = CGEventCreateKeyboardEvent(source, key, FALSE); 

    CGEventPost(kCGAnnotatedSessionEventTap, keyDown); 
    CGEventPost(kCGAnnotatedSessionEventTap, keyUp); 

    CFRelease(keyUp); 
    CFRelease(keyDown); 
    CFRelease(source); 
} 
+0

Любой способ заставить эту работу работать в режиме песочницы? –

+1

@cocoa coder: Я уверен, что нет. –

+0

В appstore есть приложения, которые могут вставлять данные в другое приложение, щелкая элементы в таблице. Интересно, как они это делают. –

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

  • Нет связанных вопросов^_^