2011-05-22 67 views
1

問題摘要:編程確定活動應用程序的文件夾(OSX)

1)如何獲取OSX下當前活動應用程序的路徑? (即擁有當前關鍵窗口的應用程序)

2)由此,我需要確定該應用程序的正常關聯的圖標文件(即當您在「應用程序中查看該應用程序時查找器顯示的圖像「文件夾,然後在出現的應用程序列表,當你按下Command(蘋果)Tab鍵)

詳細問題描述:

我開發需要顯示名稱的OSX工具欄(浮動窗口)和當前應用程序的圖標圖像(例如,擁有當前「關鍵」窗口的應用程序)

1)我需要一些編程方式來確定當前主鍵&鍵的應用程序的「.app文件夾路徑」。這可以通過通知回調,或者我可以在定時器上輪詢並觸發自己的回調。

2)我可以看到手動查找XXX.app/Resources文件夾內的文件是比較容易的,但問題是有時候該文件夾中有1個以上的文件 - 我可以看不到從單獨的文件名中確定哪個是與應用程序正常關聯的正確圖標 - 而許多應用程序使用與應用程序相同的名稱(具有icns擴展名),但有些則不然。

safari例如有一個完全無關的名稱「compass.icns」。必須有一個文件告訴finder使用哪個文件 - 或者api調用來執行此操作,任何人都有任何想法? NSApplication具有applicationIconImage方法,它顯然會返回MY應用程序的圖標 - 這不是我想要的 - 據我所知,沒有辦法爲另一個應用程序實例化NSApplication,並且將它作爲大多數方法沒有實際意義/屬性是該應用程序專用的東西。

爲什麼它的價值,我將一個Windows實用程序移植到OSX - 如果我在Windows下這樣做,我會使用GetWindowProcessID(GetForegroundWindow)),並使用它來確定應用程序的路徑,並提取圖標從那使用LoadIcon

回答

4

所有這些方法駐留在NSWorkspace類。您可以獲取活動應用程序以及其圖標圖像(無icns文件)。檢查上述類的文檔,它都應該清楚你:

NSDictionary *activeAppDict = [[NSWorkspace sharedWorkspace] activeApplication]; 
NSString *activeApplicationPath = [activeAppDict valueForKey:@"NSApplicationPath"]; 
NSImage *activeAppImage = [[NSWorkspace sharedWorkspace] iconForFile:activeApplicationPath]; 
+0

謝謝。我在提出這個問題後不久就發現了NSRunningApplication類,這個問題大部分都是我想要的,但我現在可以看到NSWorkspace是更好的選擇。乾杯。 – unsynchronized 2011-05-23 04:05:42

1

你應該能夠字符串你使用這些方法一起想:

  • - [NSWorkspace runningApplications]
  • - [NSRunningApplication活性]
  • - [NSRunningApplication bundleURL]
  • - [NSWorkspace iconForFile:]

首先通過循環運行的應用程序並選擇活動的應用程序來獲得最前面的應用程序*。獲取NSRunningApplication的bundleURL,將其轉化爲路徑,並將其傳遞給 - [NSWorkspace iconForFile:]。現在,你已經有了一個NSImage,用於最前面的應用程序。

*文檔說活動應用程序是最前面的應用程序,但我認爲它真的意味着關鍵,因爲我不希望它爲最前面但最重要的應用程序返回YES。

+0

「獲取NSRunningApplication的bundleURL,將它變成一條路徑」你說......哈!現在是這個問題......我不認爲這是可能的。 – 2011-12-04 13:25:15

+0

當然,使用 - [NSRunningApplication bundleURL],斷言[NSURL isFileURL]爲真,然後使用 - [NSURL路徑]。 – 2011-12-06 00:10:46

相關問題