1

タイトルの種類はそれをすべて言います:

OS / XCプログラム(さまざまな)が、ユーザーがFinderで実行可能ファイルをクリックして起動したのか、それとももっと実行されたのかを判断するために使用できる_NSWasLaunchedFromFinderタイプのAPIまたはフックがあるかどうか疑問に思っています。int main(int argc, char* argv[])従来のルート (ターミナルに入力されるようなもの)。

4

5 に答える 5

2

単純なコマンド ライン ユーティリティについて話している場合、Finder から起動されたのか、ターミナルから起動されたのかを判断する方法はありません。Finder はターミナルを起動し、その中でプログラムを実行するからです。

しかし、解決策があります。私はむしろそれを回避策と呼んでいます。実行可能ファイルをバンドルでラップし、単純なスクリプトを作成して (呼び出します)、実際の実行可能ファイルを追加のコマンド ライン パラメータ (たとえば)finderLauncherで起動できます。-launchedFromFinder実行可能にすることを忘れないでください。finderLauncher値として設定された Info.plist ファイルよりもCFBundleExecutable。これで、Finder ユーザーにはバンドルのみが表示され、それをクリックすると、指定されたコマンド ライン パラメータを渡す
ことで実際の実行可能ファイルが起動されます。ターミナルでコマンドを finderLauncher使用しても同じ動作になります。open
また、端末から直接起動すると、 -launchedFromFinder パラメータはありません(もちろん、ユーザーが直接渡さない場合)。

Ps Info.plist でコマンド ライン パラメーターを直接指定すると、はるかに簡単になりますが、エージェント/デーモン用のキーはあるのに、情報プロパティ リスト キー リファレンスでそのようなキーを見つけることができません。

于 2013-04-30T07:19:40.420 に答える
0

方法 1 :: NSGetExecutablePath を使用できます

ここにそれへの開発者の参照があります:: Mac Developer Library

_NSGetExecutablePath() は、メインの実行可能ファイルのパスをバッファ buf にコピーします。bufsize パラメータは、最初はバッファのサイズでなければなりません。パスが正常にコピーされた場合、この関数は 0 を返し、* bufsize は変更されません。バッファーが十分な大きさでない場合は -1 を返し、* bufsize は必要なサイズに設定されます。_NSGetExecutablePath() は、実行可能ファイルへの「実際のパス」ではなく、実行可能ファイルへの「パス」を返すことに注意してください。つまり、パスはシンボリック リンクであり、実際のファイルではない可能性があります。深いディレクトリでは、必要な bufsize の合計が MAXPATHLEN を超える可能性があります。

方法 2 :: AppleScript を使用する

AppleScript を使用して、次のスクリプトで現在開いているアプリケーションを見つけることができます ::

tell application "Finder"
set appPath to my getFrontAppPath()
set AppleScript's text item delimiters to {":"}
set currentApp to text item -2 of appPath
say currentApp
end tell

on getFrontAppPath()
    set frontAppPath to (path to frontmost application) as text
    set myPath to (path to me) as text

    if frontAppPath is myPath then
        try
            tell application "Finder" to set bundleID to id of file myPath
            tell application "System Events" to set visible of (first process whose bundle identifier is bundleID) to false

            -- we need to delay because it takes time for the process to hide
            -- I noticed this when running the code as an application from the applescript menu bar item
            set inTime to current date
            repeat
                set frontAppPath to (path to frontmost application) as text
                if frontAppPath is not myPath then exit repeat
                if (current date) - inTime is greater than 2 then exit repeat
            end repeat
        end try
    end if
    return frontAppPath
end getFrontAppPath

それがターミナルであろうとファインダーであろうと、最後に開いたアプリケーションを取得する必要があります:)

Finder の場合、応答が返されます :: "Macintosh HD:System:Library:CoreServices:Finder.app:"

ターミナルの場合 :: "Macintosh HD:Applications:Utilities:Terminal.app:"

于 2013-04-29T13:40:47.833 に答える
0

親プロセス ID を取得します。次に、Process Statusを参照して、PPID を再帰的に Finder.app またはinitまで取得します。

Finder.app の子である端末の祖先を見つけたら、その開始時刻とその引数を確認できます ( の-o-Oオプションを参照してman psください。キーワードには と を含める必要がargsありますstart): 端末プロセスがプログラムの開始時刻近くに開始された場合と、引数にはプログラム名が含まれており、Finder.app によって開始されたことがわかります。

おそらく、時間を無視して端末の引数を探すことができます。

于 2013-05-02T22:33:35.993 に答える