1

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

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

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

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

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

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

任何建议,将不胜感激。

4

3 回答 3

2

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

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

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

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

于 2009-12-29T16:54:16.660 回答
0

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

于 2009-12-29T16:34:33.813 回答
0

DLL 注入不会让您到任何地方,如果您将 Flash 播放器实例化为进程内服务器,内存仍将分配在您的主进程中。
如果您想控制内存泄漏,您必须将 Flash 播放器保持在单独的进程中。

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

于 2009-12-29T16:44:11.783 回答