如何在MacOS上以编程方式获取当前工作区

时间:2018-11-03 15:36:23

标签: macos cocoa applescript mission-control

我想能够随时告诉用户当前在macOS 10.13上以编程方式使用的任务控制工作区。 我在搜索过程中找不到任何有效的答案。 任何语言都可以,任何工作区标识符都可以为我工作(uuid,工作区号...)

谢谢您的帮助!

3 个答案:

答案 0 :(得分:1)

看起来像这样需要未记录的API调用。

https://github.com/asmagill/hs._asm.undocumented.spaces/blob/master/CGSSpace.h

CG_EXTERN CGSSpaceID CGSGetActiveSpace(CGSConnectionID cid);

可以做您想做的事,但是三年没有被使用此代码,因此系统/ api可能已经迁移,并且使用未公开的API的所有问题都适用。

在项目https://github.com/asmagill/hs._asm.undocumented.spaces

中找到了它

没有使用或验证它。

答案 1 :(得分:1)

  • 下载专用的CGSInternal标头
  • 将它们放在系统上的文件夹中
  • 转到您的项目Build Settings并将该文件夹添加到User Header Search Paths

然后您可以执行以下操作:


#import "AppDelegate.h"
#import "CGSInternal/CGSSpace.h"

@implementation AppDelegate

typedef int CGSConnection;
extern CGSConnection _CGSDefaultConnection(void);

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {

    CGSSpaceID activeSpace = CGSGetActiveSpace(_CGSDefaultConnection());
    NSLog(@"activeSpace: %zu", activeSpace);

    CFArrayRef spaceArray = CGSCopySpaces(_CGSDefaultConnection(), kCGSAllSpacesMask);
    NSLog(@"allSpaces: %@", spaceArray);
}

@end

答案 2 :(得分:1)

如果您想获得“有效答案”,请使用间接GUI“变量”来告诉您您的位置:

tell application "System Events" to text items 27 thru -1 of item 1 of (picture of every desktop as list) as string (<=较短,但在政治上不正确)

set delimOrgs to text item delimiters
set text item delimiters to {"/"}
tell application "System Events" to set BGpict to ¬
     last text item of (picture of current desktop as text)
set text item delimiters to delimOrgs
return BGpict                         [improved: user3439894's suggestion]

…例如在我的4个工作空间中的一个上返回 "Lion.jpg" ,在另一个工作空间上返回 "Sierra.jpg" ,这意味着我现在首先使用台式机3和台式机1。 / p>