swift - 在 cocoa 后台连续运行代码

标签 swift multithreading macos cocoa

我一直在使用 Swift-Keylogger作为命令行程序。

我最近开始做 mac 开发,所以想为它做一个 UI。

由于它是一个命令行程序,作者使用了 RunLoop.current.run() 以连续运行键盘记录器。

现在的问题是我无法使用 RunLoop.current.run(),因为它会阻塞 UI。

我查看了 GCD,它只运行了一段代码。但我想连续运行它。我看到了一些关于连续运行的其他文章,但我发现使用 Timer 在每“n”个指定时间后连续运行代码。

那么,如何在不阻塞 UI 的情况下替换具有相同行为的 RunLoop.current.run()

最佳答案

更新:2018 年 5 月 7 日

要从 UI 启动和停止键盘记录器,请检查此问题 GitHub


更新:18/01/2018

有人向我提出了与您相同的要求。经过一番讨论和反复试验,他找到了解决办法。

1) 只需注释掉键盘记录程序代码中的 RunLoop.main.run() 行即可。

2) 现在禁用应用沙箱。如果您想启用应用程序沙盒,请添加此授权 com.apple.security.device.usb = YES


原文:18/03/2017

我在开始写键盘记录器的时候也搜索了很多。一天后我放弃了。

我在 swift 中使用 Process 从我的 UI 运行键盘记录器。

我的做法是:

在键盘记录程序源中进行必要的修改,例如文件/文件夹的路径。

编译键盘记录源。

将键盘记录器拖到 Xcode 中的项目中,然后选中 copy if needed

可执行文件位于 .app 内的 resources 文件夹中。

使用 Process 类和 launch() 运行可执行文件以启动可执行文件/您的键盘记录器。

您应该终止创建的进程,否则键盘记录器将在后台运行。要停止键盘记录器,请在 Process 变量上使用 terminate()

代码:

let pathToKeylogger = Bundle.main.resourcePath! + "/Keylogger" // path to keylogger executable
keylogger = Process() // You need to declare this variable at class-level because you need to have the variable later to terminate it.
keylogger.launchPath = pathToKeylogger
keylogger.launch()

终止:

keylogger.terminate()

编辑:18/03/2017

尝试正常退出您的应用程序,即单击菜单栏或停靠栏中的退出而不是按 Xcode 中的停止按钮。我认为您在 Xcode 中按下了停止键。

关于swift - 在 cocoa 后台连续运行代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42835237/

相关文章:

java - 带连接的保护 block

java - .java 文件无法使用 mac 终端常用 java 命令正确运行

ios - 如何在 swift : 中创建带有参数的单例

ios - 如何仅在所有其他代码完成后才运行代码?

ios - 下载每个图像后重新加载 tableview

c++ openmp for循环在循环执行期间的最大减少值

c++ - 将参数传递给 _beginthreadex

macos - Swift 中的自定义 NSmenuitem

python - pycharm向前或向后移动光标1个字

ios - 我的音效循环的代码是什么