2016-09-22 2 views
1

저는 macOS에서 키 스트로크를 시뮬레이트하고이를 활성 애플리케이션으로 보냅니다. 나는 'A'보내 예를 들어, 스위프트 3 https://stackoverflow.com/a/27487493/5600424의 만의 라인을 따라 그 일을하고있다 :macOS에서 Quartz 이벤트로 키 스트로크 시뮬레이션 Sierra

let eventSource = CGEventSource(stateID: CGEventSourceStateID.hidSystemState) 
let key: CGKeyCode = 0  // virtual key for 'a' 
let eventDown = CGEvent(keyboardEventSource: eventSource, virtualKey: key, keyDown: true) 
let eventUp = CGEvent(keyboardEventSource: eventSource, virtualKey: key, keyDown: false) 
let location = CGEventTapLocation.cghidEventTap 
eventDown.post(tap: location) 
eventUp.post(tap: location) 

이 OSX 엘 캐피 탄 (스위프트 3, 엑스 코드 8.0)에 잘 작동되었다, 그러나 그것은 중지 macOs Sierra로 업데이트 한 후 작동합니다. 응용 프로그램 자체가 활성 상태 일 때 여전히 키 입력을 받지만 다른 응용 프로그램이 활성 상태이면 이벤트가 손실 된 것처럼 보입니다. 나는 성공없이 무슨 일이 일어나고 있는지 알아 내려고 노력했고, 그 문서는 도움이되지 못한다. 어떤 도움을 주시면 감사하겠습니다.

+0

다른 탭 위치 ('CGEventTapLocation.cgSessionEventTap')에 게시를 시도 했습니까? 또는 특정 애플리케이션을 타겟팅하는 경우'postToPSN()'을 사용 하시겠습니까? –

+0

안녕하세요 @Ken, 특정 응용 프로그램을 대상으로하지 않습니다. 포 그라운드 응용 프로그램의 활성 창에서 이벤트 (사용자가 상호 작용하는 이벤트)를 받길 원합니다. 나는 시에라 이전을 의도 한대로 일하고 있었다. 나는 또한'CGEventTapLocation.cgSessionEventTap'을 시도했지만, 동작은 바뀌지 않습니다. 다른 응용 프로그램으로 전환하면 이벤트가 무시됩니다. 어쩌면 올바른 방법은'NSWorkspace.shared(). runningApplications.first (where : {$ 0.isActive})'로 포어 그라운드 애플리케이션을 추적하고'postToPSN()'을 사용하는 것일까? – tin

+1

글쎄,'NSWorkspace.shared(). frontmostApplication'을 사용하는 것이 더 적절할 것입니다. ;) 확실히 시도해 볼 수 있습니다. Sierra는 이벤트 게시 보안을 강화하고 키 이벤트 탭핑과 같이 보조 액세스 권한이 있어야합니다. –

답변

1

질문에서 인용 된 코드는 올바르게 작동하고 주장 된 것과는 달리 엘 캐피 탄에서 시에라로 업그레이드 할 때 코드의 동작이 변경되지 않았습니다.

응용 프로그램이 백그라운드에있게되면 위의 코드로 키보드 이벤트를 보내는 기능이 독립적 인 이유로 더 이상 호출되지 않기 때문에 다른 응용 프로그램에서 키 입력을받지 못합니다.

관련 문제