Как опубликовать Quartz Event после запуска приложения Swift?
Я пишу простое приложение Cocoa, которое будет запущено из AppleScript, чтобы просто опубликовать Quartz Event в другом приложении.
Нет необходимости в пользовательском интерфейсе, поэтому я удалил окно из Интерфейсного Разработчика и выход к нему из Делегата приложения. Я вызываю закрытый метод postClickEvent() из метода applicationDidFinishLaunching(_:). Я инициализирую leftMouseDown и leftMouseUp CGEvents с помощью nil mouseEventSource в mouseCursorPosition (x: 0, y: 0) и размещаю их в расположении cghidEventTap.
import Cocoa
@NSApplicationMain
Класс AppDelegate: NSObject, NSApplicationDelegate {
func applicationDidFinishLaunching(_ aNotification: Notification) {
postClickEvent()
}
func applicationWillTerminate(_ aNotification: Notification) {
}
private func postClickEvent() {
let point = CGPoint(x: 0, y: 0)
let leftMouseDownEvent = CGEvent(mouseEventSource: nil, mouseType: .leftMouseDown, mouseCursorPosition: point, mouseButton: .left)
let leftMouseUpEvent = CGEvent(mouseEventSource: nil, mouseType: .leftMouseUp, mouseCursorPosition: point, mouseButton: .left)
leftMouseDownEvent?.post(tap: .cghidEventTap)
leftMouseUpEvent?.post(tap: .cghidEventTap)
}
}
Я ожидаю, что приложение, как только оно будет запущено, щелкнет в верхнем левом углу и откроет меню Apple, но этого не произойдет.
Я могу придумать несколько возможных решений.
- Приложению, которое запускается в отладчике, может потребоваться разрешение на публикацию события ввода пользователя низкого уровня. Нужно ли приложению разрешение на публикацию Quartz Event?
- Метод applicationDidFinishLaunching (_:) отправляется центром уведомлений по умолчанию после того, как приложение было запущено и инициализировано, но до того, как оно получило свое первое событие. Может быть, postClickEvent() следует вызывать из другого метода делегата приложения?
- События могут нуждаться в источнике событий при инициализации. Но передача источника события, инициализированного с помощью init(stateID:) для любого из трех возможных идентификаторов состояния источника события, не меняет его.
- События могут быть опубликованы только тогда, когда приложение получает фокус после полноэкранного Xcode, поэтому слишком рано нажимать на пункт меню Apple. Но спящий поток в течение 10 секунд не меняет его.
1 ответ
Использование песочницы по умолчанию является новой функцией Swift Package Manager в Xcode 9.0.
Обновлена интерпретация манифеста пакета и сборки пакета на macOS для использования изолированной программной среды, которая предотвращает доступ к сети и изменение файловой системы. Это помогает смягчить эффект вредоносных манифестов. (31107213)
Но Quartz Events несовместимы с App Sandbox.
Вы не можете изолировать приложение, управляющее другим приложением. Публикация событий клавиатуры или мыши с использованием таких функций, как CGEventPost, позволяет обойти это ограничение и поэтому не допускается в изолированном приложении.
Руководство по разработке песочницы приложения
При запуске приложения в консоли сохраняется сообщение журнала нарушений песочницы о том, что приложению отказано в управлении устройством интерфейса пользователя.
Отключение App Sandbox в редакторе целей Xcode позволяет опубликовать Quartz Event.