これは、「グラフィカルインターフェイスを備えている」ということに大きく依存します。 "ウィンドウを表示していますか?"または「ドックアイコンがありますか?」または、「Aquaコンテキストにアクセスして、必要に応じてウィンドウを表示できますか?」または「AppKitとリンクしていますか?」
ドックアイコンを持たないアプリバンドルにはInfo.plist
のキーLSUIElement
が「1」に設定されています。 CFBundleGetValueForInfoDictionaryKey()
(またはObjective-Cの場合はNSBundle
に相当)を使用してこれを取得できます。これはアプリケーションにGUIがないことを意味するのではなく、ドックに表示されないことを意味します。多くのLSUIElement
アプリにステータス項目UIがあります。
CFBundleCopyBundleURL()
などを使用して実際にInfo.plist
があることを確認することもできます。 Info.plist
がない場合は、おそらく "GUIのような"プログラムになることはありません。 (ただし、これをなくしてもGUIを生成することは可能ですが)。
あなたはAppKitのためにテストするために、弱いリンクを使用することができます。
if (NSApplicationMain != NULL) {
// We're linked with AppKit
}
あなたはUIを持っているつもりだかなり良い指標です。しかし、それは古いCarbonアプリを捕まえません。
「私はプロセスの中にいる」という意味の背景については、参考になるでしょう。私はあなたがフレームワークで、GUI以外のアプリケーションとは違ってGUIアプリケーションで動作したいと思っていますか?
画面上に描画できるアプリケーションを検出するために、私はCoreGraphics
がリンクされているかどうかをチェックします。これは10.3以降のプログラムでしか動作しませんが、かなり正確でなければなりません(私は古いQuickDrawアプリケーションがコアグラフィックスを10.3+にリンクしていると確信していますが、チェックするのは簡単ではありません)。おそらく最良の方法は、それが長い間の周りされていますので、CGColorCreate()
に対するweak linking checkを行うことで、これまで離れて行くことはほとんどありません。もちろん、物事の
extern CGColorRef CGColorCreate(CGColorSpaceRef space, const CGFloat components[])
__attribute__((weak_import));
...
if (CGColorCreate != NULL) {
// Linked with CoreGraphics. Probably a GUI
、CoreGraphicsとリンクし、画面上に描画することができるようすることができますしかし決しては画面上に実際に描画します。画像処理を行うために、CoreGraphicsにリンクすることがあります。 ApplicationServices
を探すことでより正確になるかもしれません。 ApplicationServicesVersionNumber
をNULL
に対してテストできますが、これは文書化されていません。
これは、技術的に画面に描画されないため、Xアプリをキャッチしません。彼らはGUIであるX11.appにコマンドを送ります。あなたは/ usr/X11/bin/xtermをこの目的のGUIと考えていますか?/usr/X11/bin/xeyes?
「私は画面上に描画します」と明白に言うアプリでは、特定のフラグはありません。スクリーンに描画することは、宣言する必要があるものではなく、実行するたびに実行する必要はありません。一般に見えないアプリケーションは、オプションで、時折、ステータス項目を作成することがあります。
OS X、またはBSD?2つのオペレーティングシステムでタグ付けされました – jrturton
OS X. IにBSDタグが付いています。私はBSDの解決策がOS Xでも動作すると感じているからです。 – MacGeek
なぜOS XとBSDは違ったGUI技術を使っているのですか? – millimoose