当前位置: 首页 > 面试题库 >

使用Swift模拟按键

朱锐
2023-03-14
问题内容

我正在寻找一种在OSX中模拟击键的方法。我发现了使用Objective-C的另一种解决方案针对系统范围的热键模拟按键,但是我需要使用Swift来实现。如何适应CGEventCreateKeyboardEvent?


问题答案:

链接答案上的代码可以很容易地转换为Swift代码,但是在此过程中您需要注意一些技巧:

CGEventSourceCreate接受a
CGEventSourceStateID,这是a的类型别名UInt32,但是诸如的常量kCGEventSourceStateHIDSystemState被定义为as
Int,因此您必须将它们强制转换为ie
CGEventSourceStateID(kCGEventSourceStateHIDSystemState)。与相同CGEventFlags


CGEventSourceCreateCGEventCreateKeyboardEvent返回一个Unmanaged<CGEventSource>(或Unmanaged<CGEvent>)。自动生成的用于核心图形的Swift
API不知道您是否需要释放返回的对象,因此您需要检查这些调用的API文档,然后对返回值使用takeRetainedValue()takeUnretainedValue()相应地将其转换为您要使用的基础类型。

最后,它们返回隐式解包的可选变量,因此,您需要确定是否要检查nil,或者如果它们返回一个,则只是在运行时爆炸的刺激下生活。

鉴于在演示中将Objective-C转换为演示将Cmd-Space按下Swift相当简单,我只是尝试将其粘贴到草稿应用程序中,并且效果很好:

(尽管我还没有检查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)


 类似资料:
  • 问题内容: 使用jQuery,如何在单击链接时模拟(触发?)KeyPress?例如,当用户单击以下链接时: 然后,通过单击链接,就好像他们按下了键盘上的“空格键”一样。 像这样,我假设: 关于如何实现这一目标的任何想法? 问题答案: jQuery的keypress事件旨在完成这种工作。您可以通过将字符串“keypress”传递给.trigger()来触发事件。但是,更具体地说,您实际上也可以传递j

  • 问题内容: 如何在python中模拟按键?我也想同时按下多个键。 就像是: 要么 问题答案: 尽管它特定于X,但是您可以安装xautomation软件包(在基于Debian的系统上)并用于模拟按键,例如:

  • 问题内容: 如何以编程方式模拟Droid上的按键?我想模仿一个手动按键(在机器人上显示有人正在按某个按键,但是这是通过编程方式完成的)。 有涉及的解决方案,但是在新的SDK中已经不再是选择。 问题答案: 您可以使用检测,即,从活动的onCreate调用的以下代码将导致菜单多次打开和关闭: …但是我不确定这是否是你所追求的

  • 问题内容: 搜索了几个小时后,我想知道是否有可能模拟键盘上的按下按键。例如,我希望我的程序将按键保持5秒钟,因此当我在记事本中运行它时,它看起来像是这样的:。我在互联网上尝试了不同的代码段,到目前为止,我能找到的最好的东西是: Sendkey模块也不能解决我的问题,因为它只允许您发送一次按键,而不发送按住键按下事件。我知道过autoit,它在过去使用过,但是我只是真的想知道python是否可行以及

  • 问题内容: 我正在编写一个脚本来自动运行特定模型。当模型失败时,它将等待用户输入(Enter键)。我可以检测到模型何时失败,但是无法使用python(在Linux上)模拟按键事件。Windows具有SendKeys库来执行此操作,但是我想知道Linux上是否有类似的python库。 谢谢! 问题答案: 如果“模型”以图形方式(使用X窗口系统)运行,则可能已经建议使用xsendkey或xsendke

  • 问题内容: 我正在寻找模拟在Java中短时间内按住键盘键的操作。我希望下面的代码按住A键5秒钟,但是只按一次它(在记事本中测试时会产生一个“ a”)。我是否需要使用其他东西,或者我在这里使用awt.Robot类错了吗? 问题答案: Thread.sleep()阻止当前线程(按住键的线程)执行。 如果希望它在给定的时间内按住键,也许应该在并行线程中运行它。 这是一个解决Thread.sleep()问