2009-12-29 53 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