2

Есть ли доказательство концепции Objective-C, которое вводит какой-либо текст в приложение, а затем нажимает на мышь, используя события Apple, а не AppleScript?Программно ввести текст в любое приложение

например. AppleScript эквивалент

tell application "System Events" 
tell process "Safari" 
    keystroke "Hello World" 
    click 
end tell 
end tell 

Он должен работать на Mac OS X 10.9, предпочтительно ориентированных на будущее (обратная совместимость не имеет значения). Контекст заключается в том, что я буду называть код Objective-C с другого языка.

Я говорю это потому, что я прочитал, что:

На Mac OS X 10.7, низкоуровневые Cocoa API (NSAppleEventDescriptor) до сих пор нет существенной функциональности (например, возможность отправить компании Apple события), в то время как высокоуровневый API Cocoa (Scripting Bridge) слишком ошибочен, а ограничен, чтобы стать жизнеспособной основой для оболочки в стиле приложения.

и:

NSAppleScript можно безопасно использовать только на главном потоке

так, мои цели:

  1. любое приложение (по имени или если ток)
  2. любой ввод клавиатуры или мышь
  3. от C или Objective-C
  4. в течение нескольких сотен миллисекунд

спасибо!

ответ

1

Я не уверен, если это то, что вы ищете, но вы можете быть заинтересованы в создании объекта NSInvocation:

- (void)invokeWithTarget:(id)anObject 

Если вы хотите, чтобы запустить код и «имитировать «среда UX, может быть полезно сохранить вызов и запустить его.

(Automator?)

+0

По-прежнему новичок в Objective-C, но как вы можете использовать это для отправки текстового сообщения на какой-либо объект приложения? –

+1

Ответ здесь будет очень полезен, если вы увидите, подходит ли ваша ссылка для вашей ситуации: http://stackoverflow.com/questions/313400/nsinvocation-for-dummies –

+0

Да, я бы это прочитал, следовательно, мой комментарий. Похоже на передачу общего сообщения, а не на отправку определенного сообщения о событии Apple конкретному объекту приложения в какой-то другой процесс. –

1

Лучший способ для достижения вашего результата использует Automator,

См https://developer.apple.com/library/mac/documentation/AppleApplications/Conceptual/AutomatorConcepts/AutomatorConcepts.pdf

Если вы хотите, чтобы достичь этого через ObjectiveC, вы должны понять, «Распределенные объекты Архитектура ». Сопрягая NSPort и NSInvocation, вы можете делать удивительные вещи, такие как перекрестный процесс и вызов метода перекрестной машины.

Вот руководство для этого
https://developer.apple.com/librarY/prerelease/mac/documentation/Cocoa/Conceptual/DistrObjects/Concepts/architecture.html

3

Вместо использования AppleEvent с ИПП CGEvent в рамках CoreGraphics < https://developer.apple.com/library/mac/documentation/Carbon/Reference/QuartzEventServicesRef/Reference/reference.html> позволяет размещать низкоуровневые события мыши и клавиатуры на сервер окна.

#include <CoreGraphics/CoreGraphics.h> 

NSArray *launchedApplications = [[NSWorkspace sharedWorkspace] launchedApplications]; // depreciated but I couldn't find a modern way to get the Carbon PSN 
NSPredicate *filter = [NSPredicate predicateWithFormat:@"NSApplicationName = \"TextEdit\""]; 
NSDictionary *appInfo = [[launchedApplications filteredArrayUsingPredicate:filter] firstObject]; 
ProcessSerialNumber psn; 
psn.highLongOfPSN = [[appInfo objectForKey:@"NSApplicationProcessSerialNumberHigh"] unsignedIntValue]; 
psn.lowLongOfPSN = [[appInfo objectForKey:@"NSApplicationProcessSerialNumberLow"] unsignedIntValue]; 

CGEventRef event1 = CGEventCreateKeyboardEvent(NULL, (CGKeyCode)6, true); // 'z' key down 
CGEventRef event2 = CGEventCreateKeyboardEvent(NULL, (CGKeyCode)6, false); // 'z' key up 

CGEventPostToPSN(&psn, event1); 
CGEventPostToPSN(&psn, event2); 

Вы могли бы также рассмотреть написание службы < https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/SysServices/introduction.html>, который позволяет обеспечить функциональные возможности других приложений через меню Сервис в меню приложения. Обратите внимание, что вы даже можете назначать сочетания клавиш для пунктов меню «Сервис». Услуги работают через системный картон; этот подход может быть проще, чем иметь дело с необработанными событиями оконного сервера, если вам просто нужно вставить некоторые консервированные или сгенерированные данные в другое приложение.

+0

Спасибо, я получил это. Это похоже на правильный API. Как вы нажимаете мышь? –

+1

Используйте 'CGEventCreateMouseEvent()'. См. 'CGEvent.h' (меню« Файл »>« Открыть быстро ») является вашим другом) или документацией, приведенной выше. – jrc