我正试图弄清楚如何从任务控制中获取当前空间#。来源会有所帮助,但更有帮助的是如何自己解决这个问题的信息。我写过一些苹果脚本,但通常情况下,我似乎需要做一些新的事情(我找不到字典文档),它属于“告诉这个特定应用程序(例如”系统)的类别事件“)这个非常具体的事情”我不知道我将如何实现这一点。
特别是我想要做的事情:
我 讨厌 OSX 10.7中的新任务控制。我希望我的空间“网格”回来,因为我一直使用它。我曾经每隔几秒使用箭头键(例如 ALT + ↑)在空格之间导航。现在我坚持使用这个笨重的1x9空间阵列,而不是优雅的3x3网格。我已经重新映射了我的所有空间以使用数字键盘,这部分解决了问题(因为它是一个3x3网格),但只有当我连接了外部键盘时。
基本上,我希望能够再次使用 ALT + ↑和↓,但为此我需要检测当前空间#以便我可以从空格5 - > 2切换,例如。
Dave的回答如下,虽然比我预期的要详细得多,但是需要编写一个应用程序才能做到这一点(加上它还没有完全回答这个问题)。如果可能的话,我宁愿将几个键绑定到一个AppleScript上。
答案 0 :(得分:30)
我正在努力解决这个问题。还没有,但朝着正确的方向:
uuid
... 你可以在这里阅读:
$ defaults read com.apple.spaces
$ defaults read com.apple.desktop
档案位置:
~/Library/Preferences/com.apple.spaces.plist
~/Library/Preferences/com.apple.desktop.plist
这是我的。我启用了四个空格,并显示三个条目:
$ defaults read com.apple.spaces
{
spaces = (
{
type = 0;
uuid = "9F552977-3DB0-43E5-8753-E45AC4C61973";
},
{
type = 0;
uuid = "44C8072A-7DC9-4E83-94DD-BDEAF333C924";
},
{
type = 0;
uuid = "6FADBDFE-4CE8-4FC9-B535-40D7CC3C4C58";
}
);
}
如果删除空格,该条目将从文件中删除。如果添加空格,则会添加一个条目。同样,桌面1或仪表板永远不会有条目。
我不确定是否有公共API来确定显示器上显示的空间uuid
。我假设没有uuid
表示显示1,其他人表示显示1 + n。
我快速浏览了AppleScript编辑器库(Window ---> Library),但在spaces
的系统事件下没有看到任何条目。这可能是可以通过Cocoa完成的,可能是通过私有API,但我不确定AppleScript。
更新 - 2011年7月23日
看起来Dock控制Mission Control。你可以抓住它的头文件:
/System/Library/CoreServices/Dock
/Contents/MacOS/
Dock
二进制文件复制并粘贴到您的桌面。$class-dump ~/Desktop/Dock
那会吐出所有的头文件(它很长;差不多有7,500行)。您可以看到其中出现的spaceUUID
字符串。有一个名为WVSpace
的类似乎代表了Mission Control中的一个Space,以及许多其他WV *类。
更新 - 2011年7月24日
Inside Dock中有一个名为WVSpaces
的类。它有许多属性,包括:
WVSpace *currentSpace;
unsigned int currentWorkspace;
WVSpace *nextSpace; // Space on the right???
WVSpace *previousSpace; // Space on the left???
BOOL currentSpaceIsDashboard;
BOOL dashboardIsCurrent;
...lots more...
每个WVSpace
类都有一个NSString *_uuid;
属性,可能是它的SpaceUUID。所以理论上你可以得到当前的空格数:
WVSpace *currentSpace = [[WVSpaces sharedInstance] currentSpace];
NSString *currentSpaceUUID = [currentSpace _uuid]; // Empty string if main space???
诀窍是,如何访问埋在Dock内部的私有WVSpaces
类?我假设它是Singleton,因为它具有NSMutableArray *_spaces;
属性,可能包含其中的每个空格。一次只显示一个空格(如果您使用多个监视器,则会成立;空间跨越两个空间),因此只有一个WVSpaces
实例才有意义。
所以看起来它需要一些SIMBL黑客入侵才能获得对WVSpaces
的访问权。
答案 1 :(得分:15)
我一直在四处寻找,我想出了这个:https://gist.github.com/1129406
空格具有非顺序ID和顺序索引(从0开始)。您可以通过两种方式获取ID:
get_space_id
)CGSGetWorkspace
您可以使用公共API按索引设置当前空间(尽管通知本身未公开记录):请参阅set_space_by_index
您可以使用私有CGS API CGSSetWorkspace
按ID设置当前空格。
你无法直接获取当前空间索引。但是,如果您始终使用相同的九个空格集,则可以使用set_space_by_index
一次旋转它们,收集它们的ID并构建映射。然后,您将能够从ID获取当前索引。
答案 2 :(得分:8)
......也在努力:)
你说你“需要检测当前空间#”。这不是严格正确的:要向下移动一行,你只需向右移动3个空格,所以原则上你可以绑定像
这样的东西tell application "System Events" to tell process "WindowServer"
key code {124, 124, 124} using control down
end tell
到Alt-down(使用FastScripts,Alfred或其他一些避免Automator开销的快速方法。如果你在最后一行击中了这种方法,那么这种方法会失败 - 但如果你真的是硬连线,你永远不会这样做:
您必须在“Universal Access”偏好设置面板中为“辅助设备启用访问权限”才能使key code
方法正常工作。
警告:这不起作用。当我启动上面的脚本时,我很好地跳了三个空格。问题是之后我的键盘没有响应:似乎只有窗口管理器正在接收事件:我可以关闭窗口并切换空间,但我无法与任何应用程序交互。
我的理论是,当跳转导致当前应用程序在脚本执行期间发生变化时会发生这种情况 - 但我不知道如何解决这个问题。
相关观察: Mission Control
(即/Applications/Mission Control.app/Contents/MacOS/Mission\ Control
)似乎对某些命令行参数做出反应:
Mission\ Control
:显示任务控制Mission\ Control 1
:show desktop Mission\ Control 2
:显示当前的应用程序窗口我尝试从defaults read com.apple.spaces
输入一些UUID,但这并没有做太多。在黑暗中摸索着这么多。
答案 3 :(得分:4)
我写了一个应用程序 - 它对你有用吗?
使其工作的关键是控制移位和箭头键,但如果你被困在ALT上,这可能是可以解决的。
确保在开始之前设置了9个空格(桌面),并且您需要将系统偏好设置中的默认ctrl-up和ctrl-down键绑定更改为其他内容(在键盘 - >键盘快捷键中) - > Mission Control:Mission Control和Show Desktop)。
首次运行时,它会循环显示您的桌面,以便在您第一次更改空间时枚举它们。
然后你应该可以在3x3网格中的桌面之间进行更改。
可能会有一些皱纹,但它基本上是功能性的,至少对我而言。
答案 4 :(得分:2)
答案 5 :(得分:2)
我在山狮上,这似乎对我有用。
defaults read com.apple.spaces
寻找“当前空间”。您会注意到,使用不同的活动空间运行此命令不会更改当前空间但是如果您选中并取消选中“系统偏好设置”中的复选框按钮并再次运行它,您将看到它已更新。
希望这有助于其他人!
编辑:这很难看,但我正在使用它:
killall Dock && sleep 0.2 && defaults read com.apple.spaces | grep -A1 "Current Space" | tail -1 | awk '{print $NF }' | cut -f1 -d';'
答案 6 :(得分:1)
on openNewSpace()
tell application "System Events"
—start mission control
do shell script "/Applications/Mission\\ Control.app/Contents/MacOS/Mission\\ Control"
tell process "Dock"
set countSpaces to count buttons of list 1 of group 1
--new space
click button 1 of group 1
--switch to new space
repeat until (count buttons of list 1 of group 1) = (countSpaces + 1)
end repeat
click button (countSpaces + 1) of list 1 of group 1
end tell
end tell
end openNewSpace
答案 7 :(得分:0)
我在 macOS Catalina 中为自己想出了一个解决方法,尽管我希望这应该适用于多个 macOS 版本。这个解决方案解决了我的问题,即:
很久以前我使用 Stickies.app 解决了第 1 项。我将项目名称放在足够大的字体中,以便在 Mission Control 的桌面缩略图中很容易辨认,并将粘性窗口隐藏在我的 Dock 后面,专门分配给相应项目的桌面。 (我还在停靠栏左侧下方突出的小上标文本中复制了桌面名称,以便我可以在任务控制之外识别当前桌面。)
我刚刚通过applescript解决了第2项。在 Stickie 中,我添加了一个微小的、不引人注目的字体字符串,将 Stickie 标识为桌面名称,例如'dtop'。例如。 “small_superscripted_name LARGE_NAME tiny_dtop_string”或“project1 PROJECT1 dtop”。请注意,此脚本假定项目名称不包含空格(即它只是一个单词)。如果您愿意,您可以拆分为不同的字符/字符串。这是运行时生成桌面名称的小程序脚本:
tell application "System Events"
--obtain the stickie with the desktop name
set dstr to name of first item of (windows of application process "Stickies" of application "System Events" whose name contains "dtop")
--Parse the desktop name from the stickie
set astid to AppleScript's text item delimiters
set AppleScript's text item delimiters to " "
set dname to first item of (dstr's text items)
set AppleScript's text item delimiters to astid
--Show the result in a dialog window
display dialog "Desktop: " & dname
end tell
至于第 3 项,我还没有实现它,但是我可以通过使用 osascript 调用脚本通过 cron 作业轻松进行轮询。但是,我可能会探索映射用于触发脚本的桌面键盘快捷键的可能性,例如,在控制右/左箭头后 1 秒、F3 或控制上箭头后 10 秒的延迟之后。 (它不会捕捉触发桌面更改的窗口拖动,但自从我开始使用 2 台显示器以来,它无论如何都不起作用。)
设置完成后,我可能会将桌面名称和时间戳输出到日志中,以便我可以跟踪在每个桌面上花费的时间。