2016-09-22 26 views
1

我模擬macOS中的按鍵,並將它們發送給活動應用程序。我做它沿https://stackoverflow.com/a/27487493/5600424但斯威夫特3.線路例如,發送「A」:模擬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埃爾卡皮坦(SWIFT 3時,Xcode 8.0)工作正常,但它停止在更新到macOs Sierra後工作。當應用程序處於活動狀態時它仍然會收到按鍵,但是當不同的應用程序處於活動狀態時,事件看起來會丟失。我試圖弄清楚發生了什麼,但沒有成功,文檔也沒有幫助。任何幫助將不勝感激,謝謝!

+0

你有沒有嘗試發佈到不同的抽頭位置,如'CGEventTapLocation.cgSessionEventTap'?或者,如果您針對特定的應用程序,使用'postToPSN()'? –

+0

Hi @Ken,我沒有針對特定的應用程序,我希望前臺應用程序的活動窗口接收事件(用戶正在與之交互的那個事件)。它正在按照我預定的塞拉利昂前線工作。我也嘗試過'CGEventTapLocation.cgSessionEventTap',但行爲不會改變:如果切換到另一個應用程序,事件將被忽略。也許正確的方法是使用NSWorkspace.shared()跟蹤前臺應用程序runningApplications.first(其中:{$ 0.isActive})'並使用'postToPSN()'? – tin

+1

那麼,使用'NSWorkspace.shared()。frontmostApplication'會更合適。 ;)你當然可以嘗試。也可能是塞拉利昂收緊了事件發佈安全措施,並且您需要像進行關鍵事件點擊時那樣需要輔助訪問。 –

回答

1

在問題中引用的代碼正常工作,並且從El Capitan升級到Sierra時其行爲未發生變化,與所聲稱的相反。

其他應用程序未收到的按鍵,因爲一旦應用程序在後臺,由於獨立原因,負責使用上述代碼發送鍵盤事件的功能不再被調用。