Как опубликовать 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)

Примечания к выпуску XCode

Но Quartz Events несовместимы с App Sandbox.

Вы не можете изолировать приложение, управляющее другим приложением. Публикация событий клавиатуры или мыши с использованием таких функций, как CGEventPost, позволяет обойти это ограничение и поэтому не допускается в изолированном приложении.

Руководство по разработке песочницы приложения

При запуске приложения в консоли сохраняется сообщение журнала нарушений песочницы о том, что приложению отказано в управлении устройством интерфейса пользователя.

Приставка

Отключение App Sandbox в редакторе целей Xcode позволяет опубликовать Quartz Event.

Xcode

Другие вопросы по тегам