問題タブ [nsrunningapplication]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
macos - Mac OS で実行中のアプリケーションのより正確な識別
NSWorkspace の runningApplications を使用することで、Mac OS で実行中のアプリのリストを NSRunningApplication オブジェクトとして取得し、そこからどのアプリケーションがフォアグラウンドにあるかなどの追加情報を取得できます。
名前 (localizedName) を使用して実行中のアプリケーションを識別することは可能ですが、不正なアプリケーションによってスプーフィングされる可能性があることは確かです。bundleIdentifier などの他のものの方が優れているように見えますが、それもなりすましの可能性があると思います。
パブリック アプリ ストア以外のアプリケーションでは、ほぼすべてのメタデータが偽装される可能性があると思いますが、アプリ ストアから取得したアプリの場合、bundleIdentifier のようなものはアプリを識別するための安全な方法であるはずですよね?
誰かがインターネットからダウンロードした任意のアプリを含める場合、不正なアプリを除外するためにアプリを特定するより良い方法はありますか? 欠点のない解決策はないかもしれませんが、ベストエフォートの試みを探しています。
swift - MacOS で実行中のアプリケーションを他のアプリの上に浮かせるにはどうすればよいですか?
実行中のアプリケーション ウィンドウを他のアプリの上に浮かせるように設定できるアプリケーションを作成しているため、アプリのウィンドウの外側をクリックしても、そのウィンドウは画面に残ります。
によって設定された最前面の実行中のアプリケーションはapp.activate(options: NSApplication.ActivationOptions.activateIgnoringOtherApps)
どこにあるかを使用しようとしましたが、この方法ではウィンドウのみが表示され、アプリの外側をクリックすると再び非表示になります。app
app = NSWorkspace.shared.frontmostApplication
実行中のアプリケーションのウィンドウをフローティングに設定して、ウィンドウの外側をクリックしても、アプリが他のアプリの上に表示されたままになるようにします。
swift - Swift アプリの別のインスタンスが既に実行されていることを検出する方法
インスタンスが既に実行されているかどうかを Swift アプリで検出しようとしています。実行されている場合は、ユーザーが別のインスタンスを起動しないようにします。このような動作を検出するために NSRunningApplication クラスを使用していますが、正しく動作させるのに問題があります。私はいくつかの古い投稿を読み、 flock() がそれを検出するための低レベルの方法であることを知っていますが、可能であれば「Swiftの方法で行う」ことを好みます。コードのスニペットを次に示します。
開こうとしているセッションの数に関係なく、返されるカウントの値は常に 1 のようです。何がうまくいかないのか、またはこのチェックを適切な場所で呼び出していませんか?
さらに、私のアプリでは、ユーザーが定義済みのファイル拡張子を持つファイルをダブルクリックしてアプリを起動することもできます。上記を機能させることができれば、このシナリオでも機能するはずだと思いますか?
アップデート:
アクティビティ モニターを使用してアプリの起動動作を確認した後、観察された動作の原因を特定できたと思います。
完全な開示、私のアプリはコンソールアプリを起動する新しいプロセスを作成し、このプロセスが完了して終了するまで待機します。以下の更新されたコード スニペット:
これで、アプリが最初に起動されると、最初に mySwiftApp と myConsoleApp という 2 つのプロセスが作成されます。ただし、デバッグ ダイアログ ボックスがあると、myConsoleApp の起動後に mySwiftApp プロセスが終了します。その結果、mySwiftApp のインスタンス数は 0 になりました。したがって、mySwiftApp のその後の起動は成功し、システム上で 2 つの myConsoleApp プロセスが実行されます。アラート ボックスの存在によって mySwiftApp プロセスが終了する理由は明確ではありませんが、アプリに終了信号が送信され、終了ステータスが変更されると思われます。
デバッグ ダイアログ ボックスが表示されない場合は、waitUnitlExit() のセットアップが原因で、2 番目のインスタンスを起動しようとしても表示されず、実質的に失敗に終わります。2 番目のインスタンスを起動できないため、これは「望ましい」動作ですが、ユーザーに通知する方法があると便利です。
そうするための最良の方法は何ですか?