Как я могу отправить NSString в текущий сфокусированный UIElement другого приложения?

У меня есть приложение меню без значка дока или глобального меню, это просто элемент состояния и окно.

Я подключил его к горячей клавише, которая активирует окно, и после деактивации окна я могу вернуть фокус ранее активному приложению.

Как я могу отправить NSString в активную текстовую область в другом приложении, как если бы пользователь набрал его напрямую?

Я думаю, что это возможно с помощью специальные возможности. Я хотел бы избежать использования AppleScript, если это вообще возможно.


person johndbritton    schedule 13.01.2013    source источник


Ответы (2)


Из сфокусированный элемент пользовательского интерфейса, вам потребуется получить две вещи:

Теперь прямым подходом было бы просто получить эти два атрибута, но на самом деле это неправильное решение.

Проблема в том, что значением атрибута value является простая строка. Если элемент представляет собой форматированное текстовое представление, вы потеряете все форматирование или встроенные объекты, которые могут быть у пользователя. Это было бы плохо.

Таким образом, правильный способ получить значение — получить количество символов, создайте диапазон, начиная с нуля, используя это число в качестве длины, а затем получить строка с атрибутами для этого диапазона. Если это не удается, тогда вы получаете обычное значение.

Когда у вас есть значение (как строка с атрибутами или обычная строка) и выбранный диапазон, заменить выделенный текстовый диапазон в пределах значения текстом, который вы хотите вставить . Если пользователь ничего не выбрал, диапазон будет пустым диапазоном (нулевая длина) в позиции точки вставки, а замена фактически будет вставкой.

Затем установите значение элемента в исправленную строку. (Я могу только надеяться, что установка его на атрибутированную строку сработает.)

person Peter Hosey    schedule 13.01.2013

В итоге я использовал монтажный стол и CGEventCreateKeyboardEvent(), чтобы имитировать сочетание клавиш [cmd+v] для вставки.

Перед активацией своего окна записываю предыдущее приложение:

_previousApplication = [[notification userInfo] objectForKey:NSWorkspaceApplicationKey];

После того, как я закрываю свое окно, я активирую предыдущее приложение:

[_previousApplication activateWithOptions:NSApplicationActivateIgnoringOtherApps];

Затем вставьте NSString:

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

DCPostCommandAndKey(KEY_CODE_v);
person johndbritton    schedule 24.02.2013