在另一个窗口中捕获窗口输出

时间:2009-12-29 16:19:19

标签: c++ windows winapi flash code-injection

我正在构建一个基于C ++(Qt)的应用程序来控制基于Flash的UI。因为flash运行时泄漏了大量内存,所以我们将执行UI作为.swf加载到独立的flash播放器中,与使用C ++编写的命令和控制应用程序分开。

C ++将Flash播放器作为具有适当参数的外部进程启动,并通过连接到localhost的TCP套接字与之通信。

该应用程序主要在Windows XP及更高版本上运行。

独立运行Flash播放器的不幸副作用是两个应用程序显示在Alt +选项卡列表以及Windows上的任务栏中(一个是我们的应用程序,另一个是flash播放器)。此外,当应用程序全屏运行时,闪存必须管理整个屏幕。允许C ++应用程序绘制部分屏幕将是一个巨大的改进。

我们希望以某种方式合并这两者,同时让我们自己的应用程序处于控制之中。我正在考虑谷歌浏览器的一些内容,它似乎在一个单独的进程中运行每个浏览器选项卡,同时在一个窗口中显示所有输出。

我一直在Win32 API(和谷歌)中阅读,以确定是否可以实现这一目标。 Althogh到目前为止我已经将dll注入作为唯一的半可行解决方案,但我非常想考虑该计划B.

任何建议都将不胜感激。

3 个答案:

答案 0 :(得分:2)

Alt + Tab列表显示可见的顶级(无父级)窗口,但没有WS_EX_TOOLWINDOW扩展样式。因此,如果您有两个进程中的两个窗口,但您只想在Alt-Tab列表中看到一个(并在任务栏上),那么您有几个选项:

  1. 将WS_EX_TOOLWINDOW添加到其中一个窗口。

  2. 将其中一个窗口重新设为隐藏的顶级窗口。

  3. 将其中一个窗口(可能是Flash播放器)重新显示到另一个窗口。这很棘手,但可能是Chrome和许多其他多进程单窗口应用程序的工作方式。令它变得棘手的是处理窗口的生命周期并无意中序列化消息队列。

答案 1 :(得分:0)

我想这个问题及其答案与您的问题有关: Embedding Flash Player in a C++ or Java application?

答案 2 :(得分:0)

DLL注入无法到达任何地方,如果您将Flash播放器实例化为进程内服务器,则仍会在主进程中分配内存。
如果你想控制内存泄漏,你必须将flash播放器分开。

您当前的方法听起来很可行,您唯一的问题似乎是该过程仍然可以在Alt + Tab列表中看到...据我记得,将扩展窗口样式设置为WS_EX_TOOLWINDOW应该帮助你。
要从任务栏隐藏进程,请参阅例如here