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