加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

cocoa – 使用Swift模拟按键

发布时间:2020-12-14 05:33:28 所属栏目:百科 来源:网络整理
导读:我正在寻找一种在OSX中模拟击键的方法.我找到了使用Objective-C的另一个解决方案( Simulate keypress for system wide hotkeys),但我需要使用Swift.我怎样才能适应CGEventCreateKeyboardEvent? 该链接答案的代码很容易转换为Swift代码,但是在此过程中需要注
我正在寻找一种在OSX中模拟击键的方法.我找到了使用Objective-C的另一个解决方案( Simulate keypress for system wide hotkeys),但我需要使用Swift.我怎样才能适应CGEventCreateKeyboardEvent?
该链接答案的代码很容易转换为Swift代码,但是在此过程中需要注意一些问题:

CGEventSourceCreate采用CGEventSourceStateID,它是UInt32的类型,但是诸如kCGEventSourceStateHIDSystemState之类的常量被定义为Int,因此您必须转换它们,即CGEventSourceStateID(kCGEventSourceStateHIDSystemState).与CGEventFlags一样.

CGEventSourceCreate和CGEventCreateKeyboardEvent返回一个Unmanaged< CGEventSource> (或Unmanaged< CGEvent>).自动生成的用于Core Graphics的Swift API不知道是否需要释放返回的对象,因此您需要检查这些调用的API文档,然后相应地使用takeRetainedValue()或takeUnretainedValue() value,将它们转换为您要使用的基础类型.

最后,它们会隐式返回未包装的选项,因此您需要决定是否要检查nils,或者只是回想一下运行时爆炸的兴奋.

鉴于所有这一切都非常简单,将答案中的Objective-C转换为将Cmd-Space压缩为Swift,我只是尝试将其粘贴到临时应用程序中并且工作正常:

(虽然我没有检查API文档是否保留是正确的做法)

let src = CGEventSourceCreate(CGEventSourceStateID(kCGEventSourceStateHIDSystemState)).takeRetainedValue()

let cmdd = CGEventCreateKeyboardEvent(src,0x38,true).takeRetainedValue()
let cmdu = CGEventCreateKeyboardEvent(src,false).takeRetainedValue()
let spcd = CGEventCreateKeyboardEvent(src,0x31,true).takeRetainedValue()
let spcu = CGEventCreateKeyboardEvent(src,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)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读