2016-05-04 12 views
0

私は自分のビューに別のアプリケーションを埋め込む方法を探しています。OS Xサブビュー内でアプリケーションをネストする

ビジネス上の理由は、同社がOS Xプログラムの中に埋め込みたい、多くの小さなElectron apps(基本的には内蔵のブラウザを備えた小型ポータブルウェブプログラム)を持っているということです。これらのElectronアプリは、理想的には、サブビュー内でシームレスに統合して表示するので、大きなプログラム内では小さなWebフレームのように見えます。

私はプログラマチックに別のプログラムをサブビューとして開くのが最も簡単だと思いますが、私が得ることができるものはすべて取っていきます。 NSWindowを何とかキャプチャすることさえあるかもしれません。 (Electron source is available so it is easily discoverable。)たぶん私の中に他のプログラムをドッキングする方法、または(もっと必死になって)そのビューを見つけて、私の上にそのサイズと位置を制約するコマンドを送る方法です。

これまでのところ私が見つけたのは、実際には可能ではないということです。私は私がもっと絶望的なコースを取ることができることを発見しました。私は、プロセスを起動し、そのビューを見つけて、ディスプレイ上の場所に配置することができます。ウィンドウが移動されたり、コンテンツがスクロールされたりすると、別のウィンドウを移動するためのメッセージが送信されます。しかし、それは本当に統合されていない、メニューは別々のままですが、私はそれを組み込むことはできません。

アイデアや有用な実装の詳細はありますか?

編集1:これらの応答に感謝します。私たちが電子アプリにNSWindowを何とか公開させることができたらどうでしょう?それを活用することができますか?私は、アプリケーションがメッセージを送信し、(何とか、正確にはわからない)この内部の親ウィンドウを設定できると思っています。 Windows APIでは、SetParentを何か(たとえば、異なるプロセス内の項目さえ)でも呼び出すことができるので、はるかに簡単です。しかし、ココアはもっと難しいようです。

答えて

0

これはできません。 Cocoaでは、UIアプリごとに1つだけNSApplicationインスタンスが必要です。だからあなたはfork/exec新しいプロセスとアプリケーションを起動する予定です。

あなたは、あなたがNSApplicationのカスタムサブクラスを作成して、すべてのアプリケーションでそのカスタムクラスを使用することができ、ソースコードを再コンパイルすることもできますし、NSApplicationインスタンスなしに、他のアプリケーションのNSthreadを作成して、そこから行くことができます。

+0

この回答のいくつかの部分は間違いなく正しいです。 NSApplicationの複数のインスタンスをスレッドで実行することはできません.NSEventには、私が認識しているアプリケーションはありません。 – duskwuff

+0

@duskwuffスレッドでNSApplicationインスタンスを作成するという意味ではなく、私の答えを更新しました。 NSEvent私はあなたがグローバルにマウスイベントをキャプチャできることを覚えていますが、私が確信していないことをどのくらい正確に使うのでしょうか? – PnotNP

+0

fork/execを使って新しいプロセスを開始すると、OPは既に、彼らのニーズに十分)。 – duskwuff

1

これは実際にはMac OS Xでできることではありません。アプリケーションは、あなたが望むような方法で「構成可能」ではありません。特定の非常に特殊な状況下でサブプロセスとビューを共有することは可能です(SafariやChromeタブレンダラーなど)、これを可能にするにはサブアプリケーションを非常に特殊な方法で記述する必要があります。あなたが描いている状況で実現可能なことではありません。

これらの電子アプリのソースにアクセスできる場合は、それらを1つの電子アプリケーション全体に統合することを検討してください。あるいは、これらのアプリケーションが単一のElectronアプリ内に共存できない場合は、Chromium Embedded Frameworkのようなものを使用してラッパーアプリケーションを構築することを検討してください。ただし、これでは電子フレームワークの一部を自分で実装する必要があることに注意してください。

関連する問題