是否可以使用脚本禁用 mac 中的热点?

分享于2022年07月17日 electron javascript 问答
【问题标题】:是否可以使用脚本禁用 mac 中的热点?(Is it possible to disable the hot corners in mac with a script?)
【发布时间】:2022-01-06 13:01:34
【问题描述】:

我正在使用电子应用程序,我的任务是使用脚本禁用 Mac 中的热点。我对这个主题很陌生,所以我想知道周围是否有人已经处理过类似的情况。

启动应用程序时,电子窗口不会占据整个宽度,但如果可以通过这种方式禁用热角,我们可以实现它。

任何提示将不胜感激。谢谢

  • 非常怀疑这是否可能
  • 这将是 UX 的噩梦 - 大多数用户很难弄清楚他们的热点被禁用的原因,尤其是在他们不知情或没有明确意图的情况下禁用时。请重新考虑这一要求 - 大量应用程序“ 占据整个宽度 ”而不需要诉诸于压倒一切的用户偏好。
  • @epascarello 您是否有任何文档页面基础知识可以回答为什么不可能? :/ 我似乎没有找到关于这个的明确信息——他们要求我尽快修复这张票!
  • @esqew 我错过了关键信息——应用程序是“安全的”同时它是打开的,这意味着:用户知道计算机的快捷方式和正常的东西被阻止,所以 UX 明智并不奇怪!
  • 我认为您无法通过应用程序更改系统设置。最好的办法是打开系统偏好设置。

【解决方案1】:

没有一种“安全”的方法不会冒无限期禁用用户热点的风险。 如果您的程序崩溃或以其他方式意外终止,您绝对应该确保将这些键重置为原始值 。我什至会说这绝对是 不推荐的方法 ,而且这些类型的 UX 修改黑客方式并不理想。

如果你必须这样做,你可以通过 node-applescript 做一些事情:

const applescript = require('applescript');
var hotCorners = {
    'wvous-bl-corner': null,
    'wvous-bl-corner-modifier': null,
    'wvous-br-corner': null,
    'wvous-br-modifier': null,
    'wvous-tl-corner': null,
    'wvous-tl-modifier': null,
    'wvous-tr-corner': null,
    'wvous-tr-modifier': null
}


// read current default values first
Object.keys(hotCorners).forEach(key => hotCorners[key] = applescript.execString(`do shell script "defaults read com.apple.Dock ${key}"`));

// overwrite with zeros to disable hot corner functionality
Object.keys(hotCorners).forEach(key => applescript.execString(`do shell script "defaults write com.apple.Dock ${key} -int 0"`));

当你想写回这些配置时:

Object.keys(hotCorners).forEach(key => applescript.execString(`do shell script "defaults write com.apple.Dock ${key} -int ${hotCorners[key] ?? 0}"`)); 

您还应该注意将当前配置写入比 RAM 更短暂的存储介质;最简单的方法是将 JSON 结构写入 Electron 应用程序中的文件(或存储在客户端设备上的其他位置)。

此方法的成功将取决于与 macOS 版本和客户端设备的安全状况以及用户本身相关的几个因素(他们是否接受任何与 macOS 更高版本中的此功能相关的安全提示)。因此,您还应该使用此类功能实现错误检查,以确保您能够正确应对意外情况。

为了全面披露,我不再可以使用 macOS 机器进行测试;因此,此代码 未经测试 ,我不保证它在任何方面都能成功 - 使用本指南后果自负。

  • 非常感谢您的帮助。我会将其作为一种绝对不安全的做事方式进行讨论,并尝试改变他们的想法。真的谢谢,我真的在寻找一种技术方法来支持这一点。
  • 供您参考,使用 child_process 模块可能有更直接的方法来调用 defaults ,但这是我想到的第一种方法。您可以尝试在这两种(和其他)策略之间混合使用,以达到您需要考虑需求、目标系统的安全状况等的地方。