Как программно получить текущую рабочую область в macOS - PullRequest
0 голосов
/ 03 ноября 2018

Я хотел бы иметь возможность в любое время сказать, какое рабочее пространство управления полетом пользователь в настоящее время использует программно в macOS 10.13. Я не мог найти никакого рабочего ответа во время моего поиска. Подойдет любой язык, и у меня работает любой идентификатор рабочей области (uuid, номер рабочей области ...)

Спасибо за помощь!

Ответы [ 3 ]

0 голосов
/ 18 ноября 2018
  • Скачать приватные 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
0 голосов
/ 20 ноября 2018

Если вы хотите «рабочий ответ», используйте косвенную GUI «переменную», чтобы сообщить вам, где вы находитесь:

tell application "System Events" to text items 27 thru -1 of item 1 of (picture of every desktop as list) as string (<= короче, но политически некорректно) </p>

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]

... который например возвращает "Lion.jpg" в одном из 4 моих рабочих пространств, "Sierra.jpg" в другом, что означает, что я сначала использовал рабочий стол 3 и рабочий стол 1 прямо сейчас.

0 голосов
/ 03 ноября 2018

Похоже, для этого требуются недокументированные вызовы API.

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

и

CG_EXTERN CGSSpaceID CGSGetActiveSpace(CGSConnectionID cid);

может делать то, что вы хотите, но этот код не затрагивался в течение 3 лет, поэтому system / api, возможно, мигрировали, и все проблемы с использованием недокументированных API применимы.

Нашел это в проекте https://github.com/asmagill/hs._asm.undocumented.spaces

не использовал и не проверял его.

...