2016-05-04 2 views
0

Я ищу способ встроить другое приложение в свой собственный вид.Вложение приложения внутри OS X subview

Деловая причина в том, что компания имеет много небольших Electron apps (в основном небольшую портативную веб-программу с автономным браузером), которую компания хочет встроить в программу OS X. Эти приложения Electron идеально интегрируют и отображают внутри подматрицы без проблем, поэтому они выглядят как маленькие веб-фреймы внутри нашей более крупной программы.

Я думаю, что программно было бы проще всего открыть другую программу в качестве подсмотра, но я возьму все, что смогу получить. Возможно, даже захват NSWindow каким-то образом. (Electron source is available so it is easily discoverable.) Возможно, способ состыковать другую программу внутри моей или (отчаяние) найти ее представление и отправить команды, чтобы ограничить его размер и местоположение на вершине моего.

Пока все, что я нашел, говорит, что это действительно невозможно. Я обнаружил, что могу взять более отчаянный курс. Я могу запустить процесс, найти его представление и разместить его внутри пятна на моем дисплее; когда окно перемещается или прокручивается содержимое, отправляйте сообщения для перемещения другого окна. Но это действительно не интегрировано, меню остается отдельным и т. Д., Но я не могу его включить.

Любые идеи или полезные детали реализации?

EDIT 1: Спасибо за эти ответы. Как насчет того, чтобы электронные приложения могли каким-то образом показать их NSWindow? Может ли это быть использовано? Я думаю, что приложение может отправлять сообщения и (как-то, не совсем точно), чтобы установить родительское окно внутри этого. В Windows API это намного проще, поскольку вы можете называть SetParent ничем, даже элементами внутри разных процессов. Но какао кажется сложнее.

ответ

0

Вы не можете этого сделать. Cocoa требует наличия одного экземпляра 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, вы можете захотеть использовать что-то вроде Chromium Embedded Framework для создания вашего приложения-оболочки; обратите внимание, однако, что это может потребовать, чтобы вы сами реализовали части системы Electron.

Смежные вопросы