如何在 Applescript 中关闭/取消弹出模式/对话框 window
How to close / cancel a pop-up modal / dialog window in Applescript
我正在尝试解决我制作的这个 Applescript 中的一个特定问题:https://gist.github.com/jwmann/08daed8a905cfbf4ff96
上下文:
这是一个 Applescript,您可以在其中 select VLC 播放列表中的一首歌曲,运行 Applescript 它将从原始位置删除该歌曲。
问题:
当用户试图删除当前正在播放的单首歌曲时会出现问题,而 VLC 播放列表的大小仅为单首歌曲的大小。
现在,如果您尝试删除正在播放的歌曲,VLC 将会爆炸。为了解决这个问题,我让脚本停止播放 VLC 并再次尝试删除它。
现在,如果出现此解决方法,VLC 将不再播放。在多首歌曲播放列表中,这不会很烦人。因此脚本将在脚本结束时继续播放 VLC。但是,从单个歌曲播放列表中删除歌曲后,它会将歌曲从播放列表中删除,不留下任何歌曲,因此没有播放列表。
因此,当脚本尝试播放时,它会打开一个新的 window/对话框/模态,以允许用户找到要播放的内容。这是我不想发生的事情。
我想做什么:
我需要一种方法:
- 检测正确Window
- 告诉 window 关闭
我收集到的信息:
这是window我要取消
这是 Accessibility Inspector 向我显示的有关 window 的数据。
<AXApplication: “VLC”>
<AXWindow: “Open Source”>
Attributes:
AXFocused: “0”
AXFullScreen: “0”
AXTitle: “Open Source”
AXPosition (W): “x=993 y=276”
AXGrowArea: “(null)”
AXMinimizeButton: “(null)”
AXDocument: “(null)”
AXSections (W): “<array of size 1>”
AXCloseButton: “(null)”
AXMain: “0”
AXFullScreenButton: “(null)”
AXProxy: “(null)”
AXDefaultButton: “<AXButton: “Open”>”
AXMinimized: “0”
AXChildren: “<array of size 8>”
AXRole: “AXWindow”
AXParent: “<AXApplication: “VLC”>”
AXTitleUIElement: “<AXStaticText>”
AXCancelButton: “<AXButton: “Cancel”>”
AXModal: “1”
AXSubrole: “AXDialog”
AXZoomButton: “(null)”
AXRoleDescription: “dialog”
AXSize: “w=574 h=402”
AXToolbarButton: “(null)”
AXFrame: “x=993 y=276 w=574 h=402”
AXIdentifier: “_NS:40”
Actions:
AXRaise - raise
我尝试过的事情:
tell application "System Events"
close window "Open Source" of application "VLC"
end tell
tell application "System Events"
click button "Cancel" of window "Open Source" of application "VLC"
end tell
tell application "System Events"
cancel window "Open Source" of application "VLC"
end tell
tell application "System Events" to tell (window 1 of application "VLC" whose subrole is "AXDialog") to close
在每个示例中,系统事件或 VLC(我都试过了)似乎无法找到 window "Open Source",即使它在检查器中明确称为 "Open Source"。这不是 sheet,而是 window。我不明白为什么我 找不到 这个 window.
感谢@l'L'l 向我推荐 Script Debugger 5,它允许以可读的方式查看 windows 的数据,甚至提供调用特定元素的代码。
我是怎么发现的 运行 这个代码:
tell application "VLC" to activate
tell application "System Events"
tell process "VLC"
set myUI to every UI element
end tell
end tell
原因是即使我知道 window 的名字,Applescript 也找不到它,所以我需要一种方法来查看所有内容。
在那里面,我发现了这个:
如果您查看此 window 的元数据,您会发现它已超级损坏。
难怪 Applescript 永远找不到它,它只是一个 window.
从该列表中,它提供了引用部分 window 的确切代码,包括 "Cancel" 按钮。
这是取消我的代码window:
tell application "System Events"
tell its application process "VLC"
tell its window "Open Source"
click button "Cancel"
end tell
end tell
end tell
所以搜索每个 UI 元素绝对有用,Script Debugger 5 绝对有帮助。
我正在尝试解决我制作的这个 Applescript 中的一个特定问题:https://gist.github.com/jwmann/08daed8a905cfbf4ff96
上下文:
这是一个 Applescript,您可以在其中 select VLC 播放列表中的一首歌曲,运行 Applescript 它将从原始位置删除该歌曲。
问题:
当用户试图删除当前正在播放的单首歌曲时会出现问题,而 VLC 播放列表的大小仅为单首歌曲的大小。
现在,如果您尝试删除正在播放的歌曲,VLC 将会爆炸。为了解决这个问题,我让脚本停止播放 VLC 并再次尝试删除它。
现在,如果出现此解决方法,VLC 将不再播放。在多首歌曲播放列表中,这不会很烦人。因此脚本将在脚本结束时继续播放 VLC。但是,从单个歌曲播放列表中删除歌曲后,它会将歌曲从播放列表中删除,不留下任何歌曲,因此没有播放列表。
因此,当脚本尝试播放时,它会打开一个新的 window/对话框/模态,以允许用户找到要播放的内容。这是我不想发生的事情。
我想做什么:
我需要一种方法:
- 检测正确Window
- 告诉 window 关闭
我收集到的信息:
这是window我要取消
这是 Accessibility Inspector 向我显示的有关 window 的数据。
<AXApplication: “VLC”>
<AXWindow: “Open Source”>
Attributes:
AXFocused: “0”
AXFullScreen: “0”
AXTitle: “Open Source”
AXPosition (W): “x=993 y=276”
AXGrowArea: “(null)”
AXMinimizeButton: “(null)”
AXDocument: “(null)”
AXSections (W): “<array of size 1>”
AXCloseButton: “(null)”
AXMain: “0”
AXFullScreenButton: “(null)”
AXProxy: “(null)”
AXDefaultButton: “<AXButton: “Open”>”
AXMinimized: “0”
AXChildren: “<array of size 8>”
AXRole: “AXWindow”
AXParent: “<AXApplication: “VLC”>”
AXTitleUIElement: “<AXStaticText>”
AXCancelButton: “<AXButton: “Cancel”>”
AXModal: “1”
AXSubrole: “AXDialog”
AXZoomButton: “(null)”
AXRoleDescription: “dialog”
AXSize: “w=574 h=402”
AXToolbarButton: “(null)”
AXFrame: “x=993 y=276 w=574 h=402”
AXIdentifier: “_NS:40”
Actions:
AXRaise - raise
我尝试过的事情:
tell application "System Events"
close window "Open Source" of application "VLC"
end tell
tell application "System Events"
click button "Cancel" of window "Open Source" of application "VLC"
end tell
tell application "System Events"
cancel window "Open Source" of application "VLC"
end tell
tell application "System Events" to tell (window 1 of application "VLC" whose subrole is "AXDialog") to close
在每个示例中,系统事件或 VLC(我都试过了)似乎无法找到 window "Open Source",即使它在检查器中明确称为 "Open Source"。这不是 sheet,而是 window。我不明白为什么我 找不到 这个 window.
感谢@l'L'l 向我推荐 Script Debugger 5,它允许以可读的方式查看 windows 的数据,甚至提供调用特定元素的代码。
我是怎么发现的 运行 这个代码:
tell application "VLC" to activate
tell application "System Events"
tell process "VLC"
set myUI to every UI element
end tell
end tell
原因是即使我知道 window 的名字,Applescript 也找不到它,所以我需要一种方法来查看所有内容。
在那里面,我发现了这个:
如果您查看此 window 的元数据,您会发现它已超级损坏。 难怪 Applescript 永远找不到它,它只是一个 window.
从该列表中,它提供了引用部分 window 的确切代码,包括 "Cancel" 按钮。
这是取消我的代码window:
tell application "System Events"
tell its application process "VLC"
tell its window "Open Source"
click button "Cancel"
end tell
end tell
end tell
所以搜索每个 UI 元素绝对有用,Script Debugger 5 绝对有帮助。