对于我的 Mac OSX 应用程序,我有一个功能,可以在单击按钮时删除屏幕右上角的系统时钟。控制显示哪些系统菜单(包括系统时钟)的首选项存储在 ~/Library/Preferences/com.apple.systemuiserver.plist 中。我能够更新该文件中的相关首选项以删除系统时钟。但是,需要重新启动 SystemUIServer 应用程序,以便重新加载新首选项并删除时钟。这是我用来重新启动 SystemUIServer 的代码。
NSTask *killSystemUITask = [[NSTask alloc] init];
NSMutableArray *args = [NSMutableArray array];
[args addObject:@"SystemUIServer"];
[killSystemUITask setLaunchPath:@"/usr/bin/killall"];
[killSystemUITask setArguments:args];
[killSystemUITask launch];
当 SystemUIServer 被终止时,OSX 会自动重新启动它。上面的代码可以工作,但是系统时钟的删除并不像我想要的那么干净。整个系统栏一瞬间被移除。谁能想到更好的方法将首选项重新加载到 SystemUIServer 中?理想情况下,我希望系统时钟的删除与系统偏好设置应用程序的日期和时间偏好中的时钟显示功能一样干净。
您是否考虑过尝试使用 AppleEvents/OSAScript 来驱动首选项窗格本身?虽然网络首选项窗格似乎是唯一具有完全内置脚本能力的窗格,但您可以使用系统事件驱动任何 UI。在 AppleScript 中制作原型非常容易。这是我想出的:
tell application "System Preferences"
reveal pane "Date & Time"
reveal anchor "ClockPref" of pane "Date & Time"
tell application "System Events"
tell tab group 1 of window 1 of process "System Preferences"
repeat with cbIndex from 0 to count of checkboxes
tell checkbox cbIndex
if title contains "menu bar" then
click
exit repeat
end if
end tell
end repeat
end tell
end tell
quit
end tell
您可以通过使用 NSAppleScript 对象按原样使用它,或者如果您感到受虐狂,您可以深入研究找出要发送的正确 AppleEvents 的细节。 (出于理智考虑,我建议使用前一种方法,但后者在运行时执行得更快。)
优点:简单。
缺点:启动系统偏好设置(可以看到它在 Dock 中弹出),需要启用“启用辅助设备访问”(与许多其他功能一样)
很难说这是否是visually比杀死 SystemUIServer 更好或更坏,但它几乎当然对可能与 SystemUIServer 交互的任何其他组件更友善。
至于摆脱码头反弹,这问题在这里 https://stackoverflow.com/questions/4284256/run-another-application-using-applescript-without-showing-it-on-the-dock提到如何在没有停靠图标的情况下启动程序。对此我可以补充一点,在过去,我一直在解决这个问题,而我想出的解决方案在较高层面上是这样的:
- 获取唯一/安全的临时目录
- 制作相关应用程序整个包的硬链接镜像(
pax -rwl
将对此有所帮助)
- 将硬链接的 Info.plist 替换为 Info.plist 的真实副本
- 按照其他问题中的说明编辑副本。 (注意:除了设置之外还有其他选项
NSUIElement = true
在这里,但我将这些作为练习留给读者和谷歌。)
- 使用临时目录中的应用程序
- 删除临时目录。
当我尝试驱动第三方应用程序时,事实证明这种方法非常强大。我猜您将来可能会遇到签名/沙盒的系统应用程序的问题。 (即更改其 Info.plist 会更改签名,它们可能会拒绝运行。)此外,自然地,任何沙盒应用程序都需要特定的权利或例外才能发送 AppleEvents,但我猜想杀死系统进程也是如此(如果这甚至可以通过沙盒应用程序来完成的话。)
最后,你应该向 Apple 提交错误报告 http://bugreport.apple.com如果您认为这很重要,请为此请求一流的 API 或脚本能力。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)