【问题标题】:AppleScript: right-click on menu bar item and click first option of Sleep Control CenterAppleScript:右键单击菜单栏项,然后单击睡眠控制中心的第一个选项
【发布时间】:2022-08-14 14:23:36
【问题描述】:

我是从this 问题来到这里的。

我想在我将 Mac 送入睡眠后立即禁用睡眠控制中心的睡眠预防。为此,我必须打开菜单栏图标的上下文菜单,最好是右键单击,因为我已将左键单击设置为快速切换状态而不是打开菜单。这将由在 ControlPlane 睡眠事件上触发的 AppleScript 完成。

到目前为止,我得到了这段代码:

ignoring application responses
    tell application \"System Events\" to tell process \"Sleep Control Center\"
        click menu bar item 1 of menu bar 1
    end tell
end ignoring
do shell script \"killall System\\\\ Events\"
delay 0.1
tell application \"System Events\" to tell process \"Sleep Control Center\"
    tell menu bar item 1 of menu bar 1
        tell menu 1 of menu bar item 1
            click menu item \"Deactivate\" of menu 1 # THIS DOES NOT WORK
        end tell
    end tell
end tell

如果我禁用快速状态切换,第一部分工作正常(右键单击将是首选,但我读到自 Mojave 以来 AST 不再有效,否则 this 将是解决方案)。也 \"AXShowMenu\" 不起作用。

第二部分在“单击菜单项...”处失败,因为找不到上述行的索引。我从 UIBrowser 获得了这个索引。

所以我有两个问题:

  1. 如何在不左键单击的情况下打开菜单栏项的上下文菜单?
  2. 为什么它告诉我找不到“停用”菜单项?

    标签: macos applescript ui-automation


    【解决方案1】:

    我是从this 问题来到这里的。

    十年前,如果您运行的是最新的 macOS,则不那么适用。好的,我刚刚读到您正在运行 Mojave。但是,请注意,该帖子在撰写时甚至都不适用。但是,为您进行研究并提供链接获得了巨大的赞誉——它可能已经过时,但它可以立即了解您来自哪里,这非常有用。

    最好用右键单击,因为我已将左键单击设置为快速切换状态而不是打开菜单

    为什么不设置右键单击而不是左键单击? ?

    “AXShowMenu”也不起作用。

    将您尝试使其工作的失败尝试包括在内是谨慎的做法,因为总的来说,您的代码更有可能出错,而不是action "AXShowMenu"。也就是说,AppleScript 中的东西无缘无故地不起作用肯定不是不可能的,所以......

    否则this 将是解决方案

    这将是一个解决方案,但它永远不会解决方案,最终发生的原因是:第三方工具不可靠。如果有内部方法可以做某事,那可能解决方案。

    第二部分在“单击菜单项...”处失败

    你的意思是:

    tell menu bar item 1 of menu bar 1
        tell menu 1 of menu bar item 1
            click menu item "Deactivate" of menu 1 # THIS DOES NOT WORK
        end tell
    end tell
    

    那是因为你的参考文献都搞砸了。在第一行中,您的目标是 menu bar item 1(它是 menu bar 1 的后代,因为您已正确编码)。在第二行中,您的目标是menu 1,它是menu bar item 1 的后代,然后(显然)是menu bar item 1 的后代(再次),它是menu bar 1 的后代。

    看看发生了什么……?

    当您打开 tell... 块以定位内容时,任何被“告知”的内容都会自动继承 tell 子句中的目标。因此,上面的嵌套块应该如下所示:

    tell menu bar item 1 of menu bar 1
        tell menu 1
            click menu item "Deactivate" --OR: menu item 1
        end tell
    end tell
    

    所以我有两个问题:

    1. 如何在不左键单击的情况下打开菜单栏项的上下文菜单?
    2. 为什么它告诉我找不到“停用”菜单项?

      你的问题不是你认为的问题。

      你是我多年来最喜欢的提问者。您编写了一个写得很好的问题,其中包含所有重要的细节(除了关于"AXShowMenu" 的一点,我不需要要求任何额外的东西,幸好这与前进无关);你解释每个难点的方式很棒,最后有一个总结;你做了你的研究,向我们展示了你的研究,向我们展示了你基于这项研究的尝试,并附上了一个有用的屏幕截图。我已经 +1 了你的问题,如果允许的话,我很乐意做 29 次。

      为什么不是30?好吧,您忽略了一小部分研究:

      因此,考虑到这一点,我从 App Store 中获取了该应用程序的副本,并在位于资源应用程序包内容的文件夹。我实际上并没有运行该应用程序并且暂时不打算这样做,因为我会在发布后立即将其删除(仅供参考,我使用了一个名为 Amphetamine 的程序,它是免费的,没有广告,也是 AppleScriptable,并且似乎有一大堆可以与 SCC 匹敌或超过 SCC 的触发事件)。

      你说:

      我想在我将 Mac 送入睡眠后立即禁用睡眠控制中心的睡眠预防

      然后:

      这将由在 ControlPlane 睡眠事件上触发的 AppleScript 完成。

      您的 AppleScript 的目的纯粹是为了关闭睡眠预防。原来在脚本定义文件中有一个 AppleScript 命令,叫做turn off,其描述指出:

      “停用睡眠预防”

      这是应该为您调用此命令的 AppleScript 代码:

      tell application id "com.3bitlab.AntiSleep" to turn off
      

      现在,我很确定它会替换您的整个脚本,并通过不解决您认为遇到的问题来实现您的目标。但是,为了完整起见,还有一个turn on

      tell application id "com.3bitlab.AntiSleep" to turn on
      

      该命令还带有一系列选项来设置睡眠预防模式。四个可用选项是(在命令的任何一次调用中只能选择一个):

      tell application id "com.3bitlab.AntiSleep" to turn on mode [system , display , lid , disk]
      

      以下是对每个功能的描述:

      mode Description
      system prevent system sleep
      display prevent display and system sleep
      lid prevent system sleep when lid close
      disk prevent external disks sleep

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-23
      • 2016-03-09
      相关资源
      最近更新 更多