2016-05-04 33 views
0

我正在寻找一种方法将另一个应用程序嵌入到我自己的视图中。在OS X子视图中嵌套应用程序

业务原因是该公司有许多小型Electron apps(基本上是一个小型便携式网站程序与自包含浏览器),该公司希望嵌入OS X程序内。这些电子应用程序将完美整合并无缝地显示在子视图内,因此它们看起来像我们较大程序中的小网页框架。

我想通过编程的方式打开另一个程序作为子视图是最容易的,但我会尽我所能。也许甚至捕获它NSWindow莫名其妙。 (Electron source is available so it is easily discoverable)。也许一种方法可以将我的其他程序停靠在我的内部,或者(更加绝望)找到它的视图并发送命令来限制它的大小和位置。

到目前为止,我发现所有这些都不是真的可行。我发现我可以采取更加绝望的过程。我可以启动一个流程,找到它的视图,并将其放置在我的显示器上的一个点上;当窗口被移动或者内容被滚动时发送消息来移动另一个窗口。但是,这并不是真正的整合,菜单保持独立等,但我无法将其纳入。

任何想法或有帮助的实施细节?

编辑1:谢谢你的回应。如果我们可以让电子应用程序以某种方式暴露他们的NSWindow,那么如何?这可以被利用吗?我想应用程序可以发送消息和(不知何故,确切地说)来设置父窗口在这一个。在Windows API中,它更容易,因为你可以在任何东西上调用SetParent,甚至在不同进程中的东西。但可可似乎更困难。

回答

0

你不能那样做。 Cocoa要求您每个UI应用只有一个NSApplication实例。所以你会去fork/exec出新的程序并启动你的应用程序。

如果你可以重新编译源代码,那么你可以创建自定义的NSApplication子类,并使用自定义类中的所有应用程序,也可以创建其他应用程序NSthread没有NSApplication实例,并从那里。

+0

这个答案的几个部分是绝对不正确的。你不能在线程中运行NSApplication的多个实例,并且NSEvent在这里没有任何我知道的应用程序。 – duskwuff

+0

@duskwuff我不是说在线程中创建NSApplication实例,更新了我的答案。 NSEvent我记得你可以在全局捕获鼠标事件,但你将如何使用它,我不确定 – PnotNP

+0

使用fork/exec来启动新的进程会启动子程序作为单独的应用程序,OP已经说过他们试过(并且wasn满足他们的需求)。 – duskwuff

1

这是不是真的,你可以在Mac OS X应用程序做任何事情都在你希望的方式不是“组合的” - 而这是可以用在某些非常特殊的情况下,子进程共享视图(例如,Safari或Chrome标签渲染器),这就要求以非常特定的方式编写子应用程序以允许执行此操作。在你描述的情况下,这不是可行的。

如果您有权访问这些Electron应用程序的源代码,请考虑将它们合并到一个统一的Electron应用程序中。或者,如果这些应用程序无法在单个Electron应用程序中共存,则可以考虑使用类似Chromium Embedded Framework的东西来构建包装应用程序;但请注意,这可能需要您自己实施Electron框架的一部分。