Захват оконного вывода в другом окне

Я создаю приложение на основе C ++ (Qt) для управления пользовательским интерфейсом на основе флэш-памяти. Поскольку во время выполнения флэш-памяти происходит утечка значительных объемов памяти, мы выполняем пользовательский интерфейс как файл .swf, загруженный в автономный флэш-плеер, отдельно от приложения для управления и контроля, написанного на C ++.

C ++ запускает flash player как внешний процесс с соответствующими параметрами и связывается с ним через TCP-сокет, подключенный к localhost.

Приложение работает в основном под Windows XP и выше.

К сожалению, побочный эффект автономного запуска флэш-плеера заключается в том, что два приложения отображаются в списке вкладок Alt +, а также на панели задач в окнах (одно - наше приложение, другое - флэш-плеер). Кроме того, поскольку приложение работает в полноэкранном режиме, флэш-память должна управлять всем экраном. Разрешение приложению C ++ рисовать части экрана стало бы значительным улучшением.

Мы хотели бы как-то объединить их, оставив при этом наше собственное приложение под контролем. Я думаю о чем-то вроде Google Chrome, который, похоже, запускает каждую вкладку браузера в отдельном процессе, отображая весь вывод в одном окне.

Я читал Win32 API (и Google), чтобы определить, возможно ли это вообще. Пока что я придумал инъекцию dll в качестве единственного полужизнеспособного решения, но я бы очень хотел рассмотреть этот план Б.

Мы ценим любые предложения.


person Søren Boll Overgaard    schedule 29.12.2009    source источник


Ответы (3)


Список Alt + Tab показывает окна верхнего уровня (без родительских), которые видны и не имеют расширенного стиля WS_EX_TOOLWINDOW. Итак, если у вас есть два окна из двух процессов, но вы хотите видеть только одно в списке Alt-Tab (и на панели задач), у вас есть несколько вариантов:

  1. Добавьте WS_EX_TOOLWINDOW в одно из окон.

  2. Перенастройте одно из окон в скрытое окно верхнего уровня.

  3. Перенесите одно из окон (возможно, Flash Player) в другое окно. Это сложно, но, вероятно, именно так работает Chrome и многие другие многопроцессорные однооконные приложения. Что делает его сложным, так это обработка времени жизни окон и непреднамеренная сериализация очередей сообщений.

person Adrian McCarthy    schedule 29.12.2009
comment
Большое спасибо за ваш ответ. Ваше первое предложение кажется тривиальным для реализации, по сути, оно сводится к вызову FindWindow () и SetWindowLongPtr (). Все идет нормально. Однако ваше третье предложение кажется наиболее действенным, особенно в сочетании с qt.nokia.com/doc/solutions/4/qtwinmigrate/ Я не могу понять, как происходит повторное родительство. Единственная ссылка на установку родительского окна, которую я могу найти, находится в документации CreateWindow (). Можете ли вы дать мне начало? - person Søren Boll Overgaard; 29.12.2009

Думаю, этот вопрос и ответы на него связаны с вашим вопросом: Встраивание Flash Player в приложении C ++ или Java?

person Emile Vrijdags    schedule 29.12.2009

Внедрение DLL никуда вас не приведет, память по-прежнему будет выделяться в вашем основном процессе, если вы создаете экземпляр флэш-плеера как внутрипроцессный сервер.
Если вы хотите сохранить контроль над утечками памяти, вы должны держите флеш-плеер отдельно.

Ваш текущий подход кажется жизнеспособным, ваша единственная проблема, похоже, заключается в том, что процесс все еще виден в чем-то вроде списка Alt + Tab ... насколько я помню, установка стиля расширенного окна на WS_EX_TOOLWINDOW должна помочь вам в этом.
Чтобы скрыть процесс с панели задач, см., Например, здесь.

person Georg Fritzsche    schedule 29.12.2009