我用以下方法创建了水龙头:
guard let eventTap = CGEvent.tapCreate(tap: .cgSessionEventTap,
place: .headInsertEventTap,
options: .defaultTap,
eventsOfInterest: CGEventMask(eventMask),
callback: myCGEventCallback,
userInfo: nil) else {
logger.info("failed to create event tap")
exit(1)
}
我的应用程序按预期运行。我的应用还可能在tapCreate()
之后的任何时候锁定机器,如下所示:
let task = Process()
task.arguments = ["-suspend"]
task.launchPath = "/System/Library/CoreServices/Menu Extras/User.menu/Contents/Resources/CGSession"
task.launch()
使用上述代码进入登录屏幕并重新登录后,上面创建的水龙头将与此exit关闭。
在用户重新登录后,我找不到登录挂钩或重新创建我的tap
的方法。在这种情况下如何重新启动tap
?
答案 0 :(得分:0)
找到了一种在用户重新登录时获取通知的方法。只有在启动应用程序的用户重新登录时才会触发。在applicationDidFinishLaunching
中,我添加了:
NSWorkspace.shared().notificationCenter.addObserver(self, selector: #selector(self.rebuildEventChains(aNotification:)), name: NSNotification.Name.NSWorkspaceSessionDidBecomeActive, object: nil);
具有要在登录时调用的函数:
func rebuildEventChains(aNotification : NSNotification){
// re-enable the tap if is disabled
// ...
}