2011-10-19 13 views
2

とにかく、プロセスにユーザーインターフェイスがあるかどうか確認できますか?スクリーン上の描画を扱うもの。プロセスにOSX上のグラフィカルインタフェースがあるかどうかはどうすればわかりますか?

私はthis questionを見ましたが、それは適切な答えを与えません。私はその過程の中にいる。私が照会できるいくつかのAPI、またはいくつかのテクニックがありますか?

編集:私はプロセスの中で、私はコードの注入をしています。私はgui以外のGUIアプリケーションとは異なる動作をしたい。 CFBundleGetValueForInfoDictionaryKey()またはNSApplicationMainを使用することはできません。注入モジュールのライトを保持したいから、これらのフレームワークにリンクすることはできません。

+0

OS X、またはBSD?2つのオペレーティングシステムでタグ付けされました – jrturton

+0

OS X. IにBSDタグが付いています。私はBSDの解決策がOS Xでも動作すると感じているからです。 – MacGeek

+2

なぜOS XとBSDは違ったGUI技術を使っているのですか? – millimoose

答えて

6

これは、「グラフィカルインターフェイスを備えている」ということに大きく依存します。 "ウィンドウを表示していますか?"または「ドックアイコンがありますか?」または、「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を探すことでより正確になるかもしれません。 ApplicationServicesVersionNumberNULLに対してテストできますが、これは文書化されていません。

これは、技術的に画面に描画されないため、Xアプリをキャッチしません。彼らはGUIであるX11.appにコマンドを送ります。あなたは/ usr/X11/bin/xtermをこの目的のGUIと考えていますか?/usr/X11/bin/xeyes?

「私は画面上に描画します」と明白に言うアプリでは、特定のフラグはありません。スクリーンに描画することは、宣言する必要があるものではなく、実行するたびに実行する必要はありません。一般に見えないアプリケーションは、オプションで、時折、ステータス項目を作成することがあります。

+0

お返事ありがとうございます。私はプロセスの中にいる、私はコードの注入をしています。私はgui以外のGUIアプリケーションとは異なる動作をしたい。 CFBundleGetValueForInfoDictionaryKey()またはNSApplicationMainを使用することはできません。注入モジュールのライトを保持したいから、これらのフレームワークにリンクすることはできません。 – MacGeek

+0

上記の 'NSApplicationMain'を使用していません。あなたは 'AppKit'がリンクされているかどうかをテストしています。これはあなたの "GUIアプリ"の意味がまだ答えられていません。画面上に描画できるもの、画面上に描画するもの、ドックアイコンを持つもの、またはAppKitを使用しているものですか?あなたの使い方ではGrowlはGUIですか? –

+0

画面上での描画を扱うもの。 – MacGeek

関連する問題