2017-03-20 16 views
1

現在、Macのメニューバーにあるアイコンにアクセスしたいのですが、関連するAPIやクラスを見つけるのに問題があります。私はNSStatusBar(これはMenuBarを表します)を見ましたが、それに含まれるメニューバーのアプリケーションへのパブリックアクセスは提供していません。私はまた、それぞれNSStatusItemNSStatusBarButtonを見てきました。これはメニューバーの項目とその視覚的表現を表していますが、私が見つけたのはあなた自身のことです。現在、Macのメニューバーにあるアイコンのリストを取得するにはどうすればよいですか?

どのようにしてMacのメニューバーにアイコンが表示され、どのアプリケーションに対応しているかをプログラムで確認できますか?

答えて

0

この情報を直接公開する公開APIはありません。

アクセシビリティAPIを使用して、メニューバー内に配置されているオブジェクト(y = 0)を検索し、それぞれの所有者を取得することで推測できます。ただし、これには、ユーザーがシステム環境設定で明示的に有効にする必要があるユーザー補助機能のアクセス権がアプリケーションに必要です。

0

あなたは大きさや座標でリストをフィルタ

CFArrayRef aList = CGWindowListCreate(kCGWindowListOptionOnScreenOnly|kCGWindowListExcludeDesktopElements, kCGNullWindowID); 
CFArrayRef aWindowsInfoArray = CGWindowListCreateDescriptionFromArray(aList); 

を使用することができます。 kCGWindowOwnerNameには、アプリケーションの名前が含まれます。

0

あなたはCoreGraphicsで利用可能な機能を使用することができます。

let windowList = CGWindowListCopyWindowInfo([.optionOnScreenOnly], kCGNullWindowID) as! [[String: Any]] 

for window in windowList { 
    let boundsDict = window[kCGWindowBounds as String] as! CFDictionary 
    let applicationName = window[kCGWindowOwnerName as String] as! String 
    let windowName = window[kCGWindowName as String] as! String 

    if let bounds = CGRect(dictionaryRepresentation: boundsDict), bounds.origin.y == 0 { 
     print(applicationName, windowName, bounds) 
    } 
} 

テスト中、私は、ステータスバーの項目は、その境界画面の最上部にこだわるものであることが分かりました。しかし、複数の画面の設定でテストされていません。これにもかかわらず、ステータスバー項目を所有するアプリケーションの名前だけが表示されます。バーの項目を参照するNSStatusItemのインスタンスを作成する方法が見つかりませんでした。

関連する問題