Как вставить текст из одного приложения в другое с помощью какао? - PullRequest
7 голосов
/ 21 апреля 2010

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

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

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

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

Спасибо!

Ответы [ 3 ]

8 голосов
/ 22 апреля 2010

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

Вставка - это то, что происходит вполучение заявки.Запись в буфер обмена - это копирование.

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

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

Чтобы создать этоEventВ событии посмотрите на CGEventTap .Вам нужно будет использовать функцию CGEventCreateKeyboardEvent для создания самого события, и, поскольку эта функция принимает код клавиши, вам нужно будет найти правильный код клавиши для V-части ⌘V комбинация, которая потребует прохождения через Службы ввода текста или Службы раскладки клавиатуры , в зависимости от раскладки.

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

7 голосов
/ 02 декабря 2010

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

// 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 голосов
/ 21 апреля 2010

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

...