2017-11-02 3 views
0

저는 쿼츠 이벤트를 다른 앱에 게시하기 위해 AppleScript에서 실행되는 간단한 코코아 앱을 작성하고 있습니다.Swift 애플리케이션 실행 후 Quartz 이벤트를 게시하는 방법은 무엇입니까?

사용자 인터페이스가 필요 없으므로 인터페이스 작성기에서 창을 삭제하고 응용 프로그램 대리인으로부터 출력 창을 삭제했습니다. 개인 메소드 postClickEvent()를 메소드 applicationDidFinishLaunching (_ :)에서 호출합니다. mouseCursorPosition (x : 0, y : 0)에서 nil mouseEventSource로 leftMouseDown 및 leftMouseUp CGEvents를 초기화하고 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 이벤트 게시 권한을 앱에 필요합니까?
  • 응용 프로그램이 시작된 후 알림 센터에서 applicationDidFinishLaunching (_ :) 메서드를 보내고 을 초기화했지만 첫 번째 이벤트를 받기 전에 메서드를 보냅니다. 어쩌면 Application Delegate의 다른 메서드에서 postClickEvent()를 호출해야합니까?
  • 이벤트 초기화시 이벤트 소스가 필요할 수 있습니다. 그러나 이벤트 소스가 가능한 모든 이벤트 소스 상태 ID ( ) 중 하나에 대해 init (stateID :)으로 초기화되면 이벤트 소스가 변경되지 않습니다.
  • 전체 화면 Xcode 이후에 앱이 포커스를받을 때 이벤트가 게시 될 수 있으므로 Apple 메뉴 항목 인 을 너무 일찍 클릭하십시오. 그러나 10 초 동안 스레드를 잠그면 변경되지 않습니다.
+0

내 코드는 Mac (MacOS 10.12)에서 작동합니다. AppleScript에서 이벤트를 게시 할 수 없습니까? – Willeke

+0

내 macOS 버전은 10.13.1입니다. AppleScript는 끌어서 놓기 이벤트를 게시 할 수 없으므로 신속한 서브 루틴을 호출하려고합니다. 표준 macOS Cocoa App 템플릿 또는 다른 곳의 applicationDidFinishLaunching (_ :)에서 postClickEvent()를 호출 하시겠습니까? 앱 권한 또는 입력 접근성 설정을 변경 했습니까? – Wojciech

답변

0

기본적으로 샌드 박스는 Xcode 9.0의 Swift Package Manager의 새로운 기능입니다.

네트워크 액세스 및 파일 시스템 수정을 방지하는 샌드 박스를 사용하기 위해 macOS에서 패키지 매니페스트 해석 및 패키지 빌드가 업데이트되었습니다. 이렇게하면 악의적으로 제작 된 매니 페스트의 영향을 완화하는 데 도움이됩니다. (31107213)

Xcode Release Notes

그러나 석영 이벤트는 응용 프로그램 샌드 박스와 호환되지 않습니다.

다른 앱을 제어하는 ​​앱을 샌드 박스로 만들 수 없습니다. CGEventPost와 같은 기능을 사용하여 키보드 또는 마우스 이벤트를 게시하면 이러한 제한을 피하는 방법을 제공하므로 샌드 박스 응용 프로그램에서 허용되지 않습니다.응용 프로그램을 실행

App Sandbox Design Guide

응용 프로그램은 휴먼 인터페이스 장치 제어를 거부 콘솔에서 샌드 박스 위반 로그 메시지를 남긴다. Xcode의 대상 편집기에서 응용 프로그램 샌드 박스를 사용하지 않도록

Console

석영 이벤트를 게시 할 수 있습니다.

Xcode

관련 문제