3

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

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


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

4

1 回答 1

5

上面OS X 10.10有一个SQLite名为 .x 的 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); 
}

结果:

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" )

您可以通过多种不同的方式从该文件中获取数据(例如NSTaskBashAppleScript等。这是我的首选解决方案,因为它是本机 mac 代码;不过它很简单,可以移植到其他东西上。

于 2015-06-23T21:45:04.517 回答