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