Macos 在后台应用程序上模拟按键

Macos 在后台应用程序上模拟按键,macos,swift,Macos,Swift,我正在制作一个OSX应用程序(用于一个艺术项目),它在后台运行,记录并响应用户输入。我知道当应用程序在后台运行时如何跟踪按键,但我不知道如何模拟按键并在后台运行时更新应用程序 首先,在应用程序处于后台时,输入跟踪按键的代码。这是在我的viewDidLoad函数中- NSEvent.addGlobalMonitorForEventsMatchingMask(NSEventMask.KeyDownMask, handler: handleKeyDownEvent); 下面是相应的偶数侦听器函数,我

我正在制作一个OSX应用程序(用于一个艺术项目),它在后台运行,记录并响应用户输入。我知道当应用程序在后台运行时如何跟踪按键,但我不知道如何模拟按键并在后台运行时更新应用程序

首先,在应用程序处于后台时,输入跟踪按键的代码。这是在我的viewDidLoad函数中-

NSEvent.addGlobalMonitorForEventsMatchingMask(NSEventMask.KeyDownMask, handler: handleKeyDownEvent);
下面是相应的偶数侦听器函数,我想我可以使用CGEventCreateKeyboardEvent模拟按键,但它会更新聚焦的应用程序,而不是后台的应用程序-

func handleKeyDownEvent(event:NSEvent!) {
    //try to simulate a keyboard press that updates background app
    println("key down is \(event.keyCode)");
    var e:CGEventRef = CGEventCreateKeyboardEvent(nil, 7, true).takeRetainedValue();
    CGEventPost(CGEventTapLocation(kCGHIDEventTap), e);
    //CFRelease(e);how do I use CFRelease in swift?
}

任何想法都将不胜感激,谢谢

您希望将活动发送到哪个应用程序?您可以尝试使用
CGEventPostToPSN()
将事件直接发送到目标应用程序,但我不知道有任何用于获取应用程序的
ProcessSerialNumber
(PSN)的非弃用API。此外,当一个应用程序处于非活动状态时,没有理由相信它会对一个关键事件做一些有意义的事情。仅仅因为你想取得成就并不意味着你可以。最后,在Swift中不使用
CFRelease()
。在非托管对象上调用
takeRetainedValue()
为您提供了一个托管对象,Swift将为其执行内存管理。感谢Ken Thomases,我希望将事件传递到的应用程序与我跟踪按键的应用程序是同一个应用程序-因此可能我不需要获取PSN,因为它不必引用单独的应用程序,它会引用自己吗?我想要实现的一个更基本的描述是,我只想让应用程序在后台像聚焦一样运行,不确定是否有更简单的方法来实现这一点。该项目的一个描述是-用户在一个房间里玩游戏,同时他们的按键驱动正在另一个房间中投影的绘画应用程序。除了您正在使用的全局事件监视器,您为什么需要以任何方式接收关键事件?为什么你的
handledKeyDownEvent()
方法不需要将事件重新发布到自身就不能做你想做的事情?handleKeyDownEvent在后台时不会更新/影响应用程序,它只是跟踪按键。我在想,我可以在应用程序处于后台/不集中的情况下,以某种方式更新/影响它。你可以。您只需编写代码
handleKeyDownEvent()
即可执行所需操作。没有必要重新发布该事件。只需编写代码,以执行应用程序在响应关键事件时应该执行的操作。如果您的应用程序是活动应用程序,它将如何响应关键事件?这些事件将如何处理?由什么代码处理?