macOS Code 列出正在执行的应用程式

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