Как вставить текст из одного приложения в другое с помощью какао?
Я читал о NSPasteBoard
в документации Apple, и как это позволяет приложениям писать в PasteBoard
и позволить другим приложениям читать этот текст и использовать его.
Может кто-нибудь сказать мне, как вставить текст из приложения (которое находится в строке состояния) в NSTextField
это внутри другого приложения.
Я пытаюсь сделать что-то похожее на то, что делают Snippet и SnippetsApp.
Если я совершенно глуп и пропустил очевидное в Apple Docs, не могли бы вы указать мне правильный путь:)
Спасибо!
3 ответа
Может кто-нибудь сказать мне, как вставить текст из приложения (которое находится в строке состояния) в NSTextField, который находится внутри другого приложения.
Вклеивание - это то, что происходит в принимающей заявке. Запись в монтажный картон - это копирование.
Кроме того, вы не можете предполагать, что пользователь захочет вставить в NSTextField. Это может быть NSTextView, или текстовое поле в WebView, или элемент управления Carbon EditText или MLTE, или какой-либо другой текстовый редактор, такой как текстовый редактор Qt или wxWidgets. Они могут даже использовать приложение с представлением списка, которое позволяет им вставлять текст прямо в него.
Таким образом, нет никакого программного способа напрямую сказать приложению "вот текст, вставьте его, пожалуйста". Вы должны скопировать его на общий монтажный стол, а затем создать событие, которое обычно должно вызывать вставку самого переднего приложения. Предложение Чарли о "V" - один из способов, хотя и хитрый; макет Dvorak ставит V на другой ключ, а макет "Dvorak QWERTY ⌘" ставит V-with-⌘ (в отличие от V-without-without) на тот же ключ, что и V QWERTY.
Чтобы подделать это ⌘V событие, загляните в CGEventTap. Вам нужно будет использовать CGEventCreateKeyboardEvent
функция для создания самого события, и, поскольку эта функция принимает код клавиши, вам нужно найти соответствующий код клавиши для V-части комбинации ⌘V, для чего потребуется пройти через службы ввода текста или службы раскладки клавиатуры. в зависимости от макета.
В этот момент вы можете подумать об использовании Accessibility, чтобы найти пункт меню Paste в меню Edit и отправить ему сообщение AXPress, но "Paste" и "Edit" - это только английские слова для этих понятий; если вы это сделаете, ваше приложение не будет работать на любом другом языке. Вы можете пойти по порядку (третье меню, шестой пункт меню), но тогда ваше приложение не будет работать в приложениях без меню "Файл", без элемента "Повторить" или с двумя пунктами меню "Отменить" (Photoshop). Оформление ⌘V события - это действительно путь.
Вот некоторый рабочий код для отправки события клавиши ⌘+ (при условии известного кода ключа):
// 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);
}
Обычно единственный способ - записать его на NSPasteboard, а затем переключиться на другое приложение и использовать некоторые функции Carbon, чтобы нажать "Command-V"...