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

时间:2015-06-20 13:24:26

标签: objective-c macos swift cocoa nsworkspace

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

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

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

1 个答案:

答案 0 :(得分:5)

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

目标C

desktoppicture.db

结果:

  

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

有很多其他方法可以从此文件中获取数据(例如// 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); } NSTaskBash等。这是我首选的解决方案,因为它&# 39;本机mac代码;它很简单,可以为其他东西提供便携性。