2011-02-28 40 views
4

對於我的Mac OSX應用程序,當點擊一個按鈕時,我有一個功能可以刪除屏幕右上角的系統時鐘。控制顯示系統菜單的首選項(包括系統時鐘)存儲在〜/ Library/Preferences/com.apple.systemuiserver.plist中。我能夠更新該文件中的相關首選項以刪除系統時鐘。但是,SystemUIServer應用程序需要重新啓動,以便可以重新加載新的首選項,並且可以刪除時鐘。這是我用來重新啓動SystemUIServer的代碼。如何將com.apple.systemuiserver首選項重新加載到SystemUIServer應用程序中?

NSTask *killSystemUITask = [[NSTask alloc] init]; 
NSMutableArray *args = [NSMutableArray array]; 
[args addObject:@"SystemUIServer"]; 
[killSystemUITask setLaunchPath:@"/usr/bin/killall"]; 
[killSystemUITask setArguments:args]; 
[killSystemUITask launch]; 

當SystemUIServer死亡時,OSX會自動重新啓動它。上面的代碼有效,但刪除系統時鐘並不像我想的那麼幹淨。整個系統欄被刪除一秒鐘。任何人都可以想出一個更好的方式來重新加載到SystemUIServer的偏好?理想情況下,我希望系統時鐘的清除與「系統偏好設置」應用程序的「日期&時間首選項」中的時鐘顯示功能一樣乾淨。

回答

2

你有沒有考慮嘗試使用AppleEvents/OSAScript驅動pref窗格本身?雖然Network prefs窗格似乎是唯一具有完全可編寫腳本功能的窗格,但您可以使用System Events驅動任何UI。在AppleScript中原型很容易。以下是我想出了:

tell application "System Preferences" 
    reveal pane "Date & Time" 
    reveal anchor "ClockPref" of pane "Date & Time" 
    tell application "System Events"    
     tell tab group 1 of window 1 of process "System Preferences" 
      repeat with cbIndex from 0 to count of checkboxes 
       tell checkbox cbIndex 
        if title contains "menu bar" then 
         click 
         exit repeat 
        end if 
       end tell 
      end repeat 
     end tell 
    end tell 
    quit 
end tell 

您可以使用它是通過使用NSAppleScript對象,如果你感覺自虐,你可以深入搞清楚拿捏的AppleEvents到的細節發送。 (我推薦以前的方法來保持健全,但後者在運行時會更快地執行。)

優點:簡單。

缺點:啓動系統偏好設置(可以看出,在碼頭被彈起),需要「啓用輔助設備的訪問」啓用(像許多其他的東西)

很難說,如果這是可視爲殺死SystemUIServer更好或更壞,但它幾乎是肯定更願意與任何其他可能與SystemUIServer交互的組件。

至於擺脫碼頭反彈,這question over here提到如何讓事情啓動沒有碼頭圖標。爲了這個我可以補充的是,在過去,我發生了口角這個問題,我想出了一個解決辦法是,在較高的水平,這一點:

  • 獲得唯一/安全temp目錄
  • 使硬鏈接只有整個應用程序包的鏡像(pax -rwl將有助於此)
  • 用Info.plist的實際副本替換硬鏈接Info.plist
  • 編輯每個另一個問題的方向。 (注:還有其他的選擇比這裏設置NSUIElement = true,但我離開那些作爲練習讀者和谷歌。)
  • 使用從temp目錄
  • 刪除臨時目錄中的應用程序。

在嘗試驅動第三方應用程序時,這種方法對我來說已經證明非常強大。我猜測你將來可能遇到有簽名/沙盒的系統應用程序的問題。 (即改變其Info.plist更改簽名,他們可能會拒絕運行。)另外,自然,任何沙盒應用程序將需要一個特定的授權或例外來發送AppleEvents,但我想這也是殺死系統進程(如果甚至可以從沙盒應用程序中完成)。

最後,如果您覺得這很重要,那麼您應該要求一流的API或腳本功能。

相關問題