如何在OSX上获取当前工作区/屏幕壁纸的路径?

mus*_*_ut 3 macos cocoa objective-c nsworkspace swift

从AppKit版本10.7开始,NSWorkspace.desktopImageForScreen可能会返回文件夹的路径,而不是文件的URL,这是当前的壁纸.此文件夹是按顺序拾取壁纸以供显示的位置.(setDesktopImageURL在发行说明中搜索).

如果用户将桌面图像设置为每30分钟左右随机更改一次,有没有办法确定OSX中每个屏幕当前活动的壁纸是什么?


更新:根据@ l'L'l没有答案,我创建了一个小型Mac OSX应用程序,方便地找到当前活动的壁纸:https://github.com/musically-ut/whichbg

l'L*_*L'l 5

在OS X 10.10那里有一个SQLite名为的3.x数据库desktoppicture.db.当发生定时随机桌面图片转换或系统偏好设置>桌面有任何更改时,此db文件存储诸如当前桌面图片,目录,空间,间隔等信息:

Objective-C的

// Get Current Desktop Picture

- (IBAction)getDesktopPicture:(id)sender {

    [self getCurrentDesktop];
}

-(void)getCurrentDesktop {

    NSMutableArray *sqliteData = [[NSMutableArray alloc] init];

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSApplicationSupportDirectory, NSUserDomainMask, YES);
    NSString *appSup = [paths firstObject];
    NSString *dbPath = [appSup stringByAppendingPathComponent:@"Dock/desktoppicture.db"];

    sqlite3 *database;
    if (sqlite3_open([dbPath UTF8String], &database) == SQLITE_OK) {

        const char *sql = "SELECT * FROM data";
        sqlite3_stmt *sel;
        if(sqlite3_prepare_v2(database, sql, -1, &sel, NULL) == SQLITE_OK) {

            while(sqlite3_step(sel) == SQLITE_ROW) {
                NSString *data = [NSString stringWithUTF8String:(char *)sqlite3_column_text(sel, 0)];
                [sqliteData addObject:data];
            }
        }
    }
    NSUInteger cnt = [sqliteData count] - 1;
    NSLog(@"Desktop Picture: %@", sqliteData[cnt]);
    NSLog(@"%@",sqliteData);

    sqlite3_close(database); 
}
Run Code Online (Sandbox Code Playgroud)

结果:

2015-06-23 14:36:04.470 CurrentDesktop [72591:87862519]桌面图片:Poppies.jpg 2015-06-23 14:36:04.470 CurrentDesktop [72591:87862519]("60.0",1,"Poppies.jpg" )

有相当多的不同的其他方式,你可以从这个文件中获得的数据(例如NSTask,Bash,AppleScript等等,这是我的首选解决方案,因为它是原生的Mac代码;它足够简单,使便携式的,虽然别的东西.