2009-12-29 55 views
1

我正在构建一个基于C++(Qt)的应用程序来控制基于Flash的用户界面。由于Flash运行时会泄漏大量的内存,因此我们将UI作为独立Flash Player中加载的.swf执行,与用C++编写的命令与控制应用程序分开。在另一窗口中捕获窗口输出

C++使用适当的参数将Flash播放器作为外部进程启动,并通过连接到本地主机的TCP套接字与它进行通信。

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

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

我们想以某种方式合并这两个,同时让我们自己的应用程序控制。我正在考虑一些Google Chrome浏览器,这些浏览器似乎在单独的进程中运行每个浏览器选项卡,同时在单个窗口中显示所有输出。

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

任何建议,将不胜感激。

回答

2

Alt + Tab列表显示顶层(无父窗口)可见的窗口,并且没有WS_EX_TOOLWINDOW扩展样式。所以,如果你有两个过程两个窗口,但你只希望看到一个在使用Alt-Tab列表(和任务栏上),那么你有几种选择:

  1. 的WS_EX_TOOLWINDOW加入的一个窗户。

  2. 将其中一个窗口重新保存到隐藏的顶层窗口。

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

+0

非常感谢您的回答。 你的第一个建议看起来微不足道,它实际上归结为调用FindWindow()和SetWindowLongPtr()。到现在为止还挺好。 但是,您的第三个建议似乎是最有效的,尤其是与http://qt.nokia.com/doc/solutions/4/qtwinmigrate/winmigrate-win32-in-qt-example.html 一起使用时,我可以似乎不知道如何重新装修。我只能找到设置父窗口的参考,它位于CreateWindow()文档中。 你能否为我提供一个开始的地方? – 2009-12-29 20:10:06

+0

'SetParent()':http://msdn.microsoft.com/en-us/library/ms633541(VS.85).aspx – 2009-12-30 16:31:28

0

DLL注入不会让你随时随地,内存仍然会在你的主要过程,如果你实例化Flash Player的分配作为进程内服务器。
如果你想保持对内存泄漏的控制,你必须保持在单独的过程中的Flash播放器。

你目前的方法听起来可行,你唯一的问题似乎是,这个过程仍然可以看到像Alt + Tab列表......据我所知,设置扩展窗口样式为WS_EX_TOOLWINDOW应该可以帮助你那。
要从任务栏中隐藏进程,请参阅here