链接答案上的代码很容易转换为 Swift 代码,但是在此过程中您需要注意一些问题:
CGEventSourceCreate 采用CGEventSourceStateID,这是UInt32 的类型别名,但诸如kCGEventSourceStateHIDSystemState 之类的常量被定义为Int,因此您必须将它们转换为CGEventSourceStateID(kCGEventSourceStateHIDSystemState)。 CGEventFlags 也是如此。
CGEventSourceCreate 和 CGEventCreateKeyboardEvent 返回一个 Unmanaged<CGEventSource>(或 Unmanaged<CGEvent>)。 Core Graphics 的自动生成的 Swift API 不知道返回的对象是否需要由您释放,因此您需要检查这些调用的 API 文档,然后在返回时相应地使用 takeRetainedValue() 或 takeUnretainedValue()值,将它们转换为您要使用的基础类型。
最后,它们返回隐式解包的可选项,因此您需要决定是要检查 nil 还是仅仅忍受运行时爆炸的兴奋(如果它们返回一个)。
鉴于在演示按 Cmd-Space 到 Swift 的答案中将 Objective-C 转换为非常简单,我只是尝试将其粘贴到一个草稿应用程序中并且效果很好:
(虽然我还没有检查 API 文档来确定保留是否正确)
let src = CGEventSourceCreate(CGEventSourceStateID(kCGEventSourceStateHIDSystemState)).takeRetainedValue()
let cmdd = CGEventCreateKeyboardEvent(src, 0x38, true).takeRetainedValue()
let cmdu = CGEventCreateKeyboardEvent(src, 0x38, false).takeRetainedValue()
let spcd = CGEventCreateKeyboardEvent(src, 0x31, true).takeRetainedValue()
let spcu = CGEventCreateKeyboardEvent(src, 0x31, false).takeRetainedValue()
CGEventSetFlags(spcd, CGEventFlags(kCGEventFlagMaskCommand));
CGEventSetFlags(spcd, CGEventFlags(kCGEventFlagMaskCommand));
let loc = CGEventTapLocation(kCGHIDEventTap)
CGEventPost(loc, cmdd)
CGEventPost(loc, spcd)
CGEventPost(loc, spcu)
CGEventPost(loc, cmdu)