OSX Lion AppleScript:如何从任务控制中获取当前空间#?

Mar*_*ahn 45 macos applescript spaces mission-control

我正在试图弄清楚如何从任务控制中获取当前空间#.来源会有所帮助,但更有帮助的是如何自己解决这个问题的信息.我写过一些苹果脚本,但通常情况下,我似乎需要做一些新的事情(我找不到字典文档),它属于"告诉这个特定应用程序(例如"系统)的类别事件")这个非常具体的事情"我不知道我将如何实现这一点.


特别是我想要做的事情:

讨厌 OSX 10.7中的新任务控制.我希望我的空间"网格"回来,因为我一直使用它.我曾经每隔几秒钟使用箭头键(例如ALT+ )在空格之间导航.现在我坚持使用这个笨重的1x9空间阵列,而不是优雅的3x3网格.我已经重新映射了我的所有空间以使用数字键盘,这部分地解决了问题(因为它是一个3x3网格),但只有当我连接了外部键盘时.

基本上,我希望能够用ALT+ 了,但这样做,我需要检测当前空间#,这样我可以从太空中5开关- > 2,例如.

Dave的回答如下,虽然远比我预期的要详细,但需要编写一个应用程序才能做到这一点(加上它仍然没有完全回答这个问题).如果可能的话,我宁愿把几个键绑定到一个AppleScript上.

Dav*_*her 30

我想弄清楚自己.还没有,但朝着正确的方向:

  • 每个任务控制"空间"都被uuid分配给它......
  • ...除了第一个(AFAIK)和仪表板之外.

你可以在这里阅读:

$ defaults read com.apple.spaces
$ defaults read com.apple.desktop
Run Code Online (Sandbox Code Playgroud)

档案位置:

~/Library/Preferences/com.apple.spaces.plist
~/Library/Preferences/com.apple.desktop.plist
Run Code Online (Sandbox Code Playgroud)

这是我的.我启用了四个空格,并显示三个条目:

$ 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";
        }
    );
}
Run Code Online (Sandbox Code Playgroud)

如果删除空格,该条目将从文件中删除.如果添加空格,则会添加一个条目.同样,桌面1或仪表板从未有过任何条目.

我不确定是否有公共API来确定uuid显示器上显示的空间.我假设没有uuid显示1,其他人的意思是显示1 + n.

我快速浏览了AppleScript编辑器库(Window ---> Library),没有在System Events下看到任何条目spaces.这可能是可以通过Cocoa完成的,可能是通过私有API,但我不确定AppleScript.


更新 - 2011年7月23日

它看起来像Dock控制任务控制.您可以像这样获取其头文件:

  1. 去: /System/Library/CoreServices/Dock
  2. 右键单击并显示包内容
  3. 导航: /Contents/MacOS/
  4. Dock二进制文件复制并粘贴到桌面.
  5. 跑: $class-dump ~/Desktop/Dock

那将会吐出所有的头文件(它很长;差不多有7,500行).你可以看到spaceUUID那里出现的字符串.有一个类叫做WVSpace,它似乎代表了Mission Control中的一个Space,以及许多其他WV*类.

我明天会继续看; 现在太累了.:)


更新 - 2011年7月24日

在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...
Run Code Online (Sandbox Code Playgroud)

每个WVSpace类都有一个NSString *_uuid;属性,可能是它的SpaceUUID.所以从理论上讲你可以得到当前的空间数:

WVSpace *currentSpace = [[WVSpaces sharedInstance] currentSpace];
NSString *currentSpaceUUID = [currentSpace _uuid];     // Empty string if main space???
Run Code Online (Sandbox Code Playgroud)

诀窍是,如何访问WVSpaces埋在Dock内的私有类?我假设它是Singleton,因为它有一个NSMutableArray *_spaces;属性,可能是其中列出的每个空间.一次只显示一个空格(如果您使用多个监视器,则会成立;空间跨越两个空间),因此只有一个WVSpaces实例才有意义.

因此看起来它需要一些SIMBL黑客入侵才能获得访问权限WVSpaces.


LaC*_*LaC 15

我一直在四处寻找,我想出了这个:https://gist.github.com/1129406

空格具有非顺序ID和顺序索引(从0开始).您可以通过两种方式获取ID:

  • 来自公共API(请参阅get_space_id)
  • 来自私人CGS API CGSGetWorkspace

您可以使用公共API通过索引设置当前空间(尽管通知本身未公开记录):请参阅 set_space_by_index

您可以使用私有CGS API按ID设置当前空间CGSSetWorkspace.

无法直接获取当前空间索引.但是,如果您总是使用相同的九个空格,则可以使用它们一次旋转set_space_by_index,收集它们的ID并构建映射.然后,您将能够从ID获取当前索引.

  • @cocoacoder-API存在于Mountain Lion上,但不执行或返回任何有用的方法。 (2认同)

Jan*_*nus 8

...也一直在努力:)

你说你"需要检测当前空间#".这并不严格:要向下移动一行,你只需向右移动3个空格,所以原则上你可以绑定类似的东西

tell application "System Events" to tell process "WindowServer"
    key code {124, 124, 124} using control down
end tell
Run Code Online (Sandbox Code Playgroud)

Alt-down(使用FastScripts,Alfred或其他一些避免Automator开销的快速方法).如果您在最后一行中遇到了这种方法,那么这种方法将会失败 - 但如果您真的是硬连线,那么您永远不会这样做:)
您必须在"Universal Access"偏好设置面板中为"辅助设备启用访问" key code工作方法.

警告:这不起作用.当我启动上面的脚本时,我很好地跳了三个空格.问题是之后我的键盘没有响应:似乎只有窗口管理器正在接收事件:我可以关闭窗口并切换空间,但我无法与任何应用程序交互.
我的理论是,当跳转导致当前应用程序在脚本执行期间发生变化时会发生这种情况 - 但我不知道如何解决这个问题.

一个相关的观察:Mission Control(即/Applications/Mission Control.app/Contents/MacOS/Mission\ Control)似乎对某些命令行参数反应:

  • Mission\ Control:显示任务控制
  • Mission\ Control 1:显示桌面
  • Mission\ Control 2:显示当前应用程序窗口

我尝试从中输入一些UUID defaults read com.apple.spaces,但这并没有做太多.在黑暗中摸索着这么多.


sds*_*kes 5

我写了一个应用程序 - 它对你有用吗?

改变空间.app

使其工作的按键是 Control-Shift 和箭头键,尽管如果您卡在 ALT 上,这可能是可以修复的。

确保在开始之前设置了 9 个空格(桌面),并且您需要将系统偏好设置中的默认 ctrl-up 和 ctrl-down 键绑定更改为其他内容(在键盘 -> 键盘快捷键 -> 任务控制中) :任务控制和显示桌面)。

第一次运行时,它会在您第一次更改空间时循环遍历您的桌面以枚举它们。

然后您应该能够像在 3x3 网格中一样在桌面之间进行更改。

可能会有一些皱纹,但它基本上是功能性的,至少对我来说是这样。