macOS Code 列出正在执行的应用程式
macOS中要列出正在执行的应用程式时该怎么做?这里要介绍2个物件:NSWorkspace、NSRunningApplication,由NSWorkspace来取得NSRunningApplication阵列,每一个正在执行的应用程式资讯封装成NSRunningApplication物件,自已开发的应用程式里再使用NSRunningApplication物件提供的method利用在程式中,例如:侦测某应用是否正在执行中。
NSWorkspace
NSWorkspace物件提供Cocoa应用程式与macOS作业系统间沟通的多样化的服务,其中包括:启动应用程式、应用程式资讯、档案服务、以及其他作业系提供特殊功能,它是以单例物件存在,所以在使用时必需要先取得物件:
//-----------start----------- NSWorkspace *nsWorkspace=[NSWorkspace sharedWorkspace]; //------------end------------
取得物件后就能使用NSWorkspace提供的method,先以 openURL
method为例子:
//-----------start----------- NSWorkspace *nsWorkspace=[NSWorkspace sharedWorkspace]; [nsWorkspace openURL:[NSURL URLWithString:@"http://cms.35g.tw/coding"]]; //------------end------------
执行后就会使用预设的浏览器浏览http://cms.35g.tw/coding
内容。
如果要列出正在执行的应用程式时需使用runningApplications
method,它会将当下正在执行的所有应用程式存入阵例中,并将资讯内容以NSRunningApplication
物件传递,所以程式内容会是:
//-----------start----------- NSWorkspace *nsWorkspace=[NSWorkspace sharedWorkspace]; NSArray *runningApplicationsArray = [nsWorkspace runningApplications]; //------------end------------
NSRunningApplication
NSRunningApplication物件用来处理与提供应用程式的资讯,例如将应用程式隐藏、取消隐藏,不过这限于该使用者执行的应用程式能被取得资讯与使用,但NSRunningApplication无法提供应用程式中详细的资讯,像取得应用程式执行时使用的所有程序资讯。
NSRunningApplication提供的method中,与应用程式资讯有关:
method | 说明 |
---|---|
localizedName | 应用程式名称 |
icon | 应用程式图示(会直接给NSImage资源) |
bundleIdentifier | 应用程式Bundle Name(CFBundleIdentifier) |
bundleURL | 应用程式存放位置 |
executableArchitecture | 应用程式架构(32bit,64bit,PPC,PPC64) |
executableURL | 应用程式的执行档名及位址 |
launchDate | 启动应用程式时间 |
finishedLaunching | 应用程式是否已经启动完成 |
processIdentifier | 应用程式的PID |
ownsMenuBar | 应用程式是否有Menu Bar |
列出正在执行的应用程式,需要用到localizedName将应用程式名称显示:
//-----------start----------- NSWorkspace *nsWorkspace=[NSWorkspace sharedWorkspace]; NSArray *runningApplicationsArray = [nsWorkspace runningApplications]; for (NSRunningApplication *nsApp in runningApplicationsArray) { NSLog(@"%@",nsApp.localizedName); } //------------end------------
执行结果:
2014-05-16 00:10:21.551 [1606:303] gamed 2014-05-16 00:10:21.559 [1606:303] EscrowSecurityAlert 2014-05-16 00:10:21.560 [1606:303] Google Chrome 2014-05-16 00:10:21.561 [1606:303] Google Chrome Helper 2014-05-16 00:10:21.640 [1606:303] Google Chrome Helper 2014-05-16 00:10:21.640 [1606:303] Google Chrome Helper 2014-05-16 00:10:21.641 [1606:303] Google Chrome Helper 2014-05-16 00:10:21.641 [1606:303] Google Chrome Helper 2014-05-16 00:10:21.642 [1606:303] Google Chrome Helper 2014-05-16 00:10:21.642 [1606:303] Google Chrome Helper 2014-05-16 00:10:21.643 [1606:303] Google Chrome Helper 2014-05-16 00:10:21.643 [1606:303] Safari 2014-05-16 00:10:21.644 [1606:303] Safari Networking 2014-05-16 00:10:21.645 [1606:303] AppleSpell.service 2014-05-16 00:10:21.645 [1606:303] Google Chrome Helper 2014-05-16 00:10:21.646 [1606:303] Google Chrome Helper 2014-05-16 00:10:21.646 [1606:303] Path Finder
范例程式
以上做法了解后,接下来将列出执行应用程式的资讯增加UI,让它具有功能性,完成的画面就在一开始看到的例图一样:
可以经过卷动观看资讯,并且在资讯提供里还增加应用程式图示及程序的ID(PID),这样看起来有没有比像工作管理员。
设计画面
画面设计上只放了Table View元件,并且增加三个栏位,第1个放置图示,第2个为程式名称,第3个为处理程序ID:
程式说明
Table View使用方式主要以类似资料库方式运作,所以必需要指定dataSource
,我们将它指定成self
:
//-----------start----------- //@property (strong) NSWorkspace *workspace; //@property (strong) IBOutlet NSTableView *tableview; - - (void)applicationDidFinishLaunching:(NSNotification *)aNotification { // Insert code here to initialize your application self.workspace = [NSWorkspace sharedWorkspace]; self.tableview.dataSource = self; [self.tableview reloadData]; } //------------end------------
第一次载入使用reloadData
重新载入资料,接下来要实作dataSource
,主要有2个method,1个是回报资料笔数:
//-----------start----------- - (NSInteger)numberOfRowsInTableView:(NSTableView *)tableView { runningApplicationArray = [self.workspace runningApplications]; NSLog(@"%@",runningApplicationArray); return [runningApplicationArray count]; } //------------end------------
另一个是传回指定笔数的资料内容,但因为每笔资料中TableView中有三个栏位要回报,所以我们要先替栏位加注ID,以便在回报资料时除了知道要哪一笔资料外,还可以知道是给哪个栏位的资讯:
依序将栏位的Identity命名为Column_1(图示)、Column_3(执行程式名称)、Column_3(PID),这样下面程式就就可以使用它来判断:
//-----------start----------- // - (id)tableView:(NSTableView *)tableView objectValueForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row; { //row值当做目前要提供第几笔资料 NSRunningApplication *runningApplication; //第一栏 if ([[tableColumn identifier] isEqualToString:@"Column_1"]) { runningApplication = [runningApplicationArray objectAtIndex:row]; //将icon资讯回报 return [runningApplication icon]; } //第二栏 if ([[tableColumn identifier] isEqualToString:@"Column_2"]) { runningApplication = [runningApplicationArray objectAtIndex:row]; //回报程式名称 return [runningApplication localizedName]; } //第三栏 if ([[tableColumn identifier] isEqualToString:@"Column_3"]) { runningApplication = [runningApplicationArray objectAtIndex:row]; //回报程式处理程序ID(PID) return [[NSNumber alloc] initWithInteger:(NSInteger)[runningApplication processIdentifier]]; } return Nil; } //------------end------------
详细内容直接参考范例程式的原始码,有其他不了解的可以提出来。
参考文件
更新日志
日期 | 内容 |
---|---|
2017/05/31 | 更新内容 |
2015/05/16 | 初版 |
关键字
- 列出正在执行的应用程式
- NSWorkspace NSRunningApplication