2012-05-04 42 views
7

情況:我有一個軟件,通過互聯網執行屏幕共享,其中一個用戶充當演示者,其他用戶充當觀衆/參與者。如何屏幕捕獲,除了一些窗口

除了演示窗口,演示者還有一組顯示在屏幕上的非共享窗口(用於開始共享/停止共享等的按鈕欄,Skype窗口等)。

演示者可以通過屏幕共享軟件的設置進行配置,以使這些非共享窗口不可見(即它們不會出現在正在發送給與會者的屏幕共享中,但它們後面的窗口內容將會出現在屏幕截圖中)。

截圖以大約10幀每秒,或更快發送。

問題:如何以編程方式捕獲屏幕,但這些非共享窗口除外?

  • 由於較高的幀每秒值,我不能最小化/最大化對這些窗口/組α,因爲這樣的話窗口閃爍。該應用程序是用Win32 C++編寫的。
  • 我會使用分層的窗口,但由於Windows 7桌面組合功能,這是不可用的開箱即用(並且在Windows 8中,您不能再使用DwmEnableComposition暫時和以編程方式禁用組合)
  • 我可以使用分層窗口的方法適用於Windows XP/2000/7等,併爲Windows 8不同的方法(如果有的話),但我寧願一個單一的過程,在所有系統上的工作
  • 我也可以嘗試通過捕獲單獨的圖像(桌面,需要捕獲的窗口)和使用它們的z-index來創建最終圖像來「構圖」屏幕截圖,但是由於所需的幀每秒值,該過程會太慢。
+0

我確實知道MSFT的會議是一個很好的例子,雖然不知道如何做。 – zinking

+0

謝謝 - 有類似的產品可以做到這一點(JoinMe或GTM),我也會嘗試調查這一點,但我希望得到更快的答案。 –

+0

屏幕捕捉通常會捕獲「窗口上方的屏幕區域」,而不是窗口本身的繪製內容。您可以嘗試捕獲所有可見的頂級窗口並重新組合它們。 – Deanna

回答

-1

我認爲限制大窗口內的捕捉內容會更簡單。否則你需要從屏幕截圖中剪下一些窗口。

+0

謝謝,但由於它是一個屏幕共享應用程序(再次,像JoinMe和GoToMeeting這樣的S/W已經這樣做),強迫用戶只選擇一個窗口不是用戶友好的(或商業智慧):) –

+3

無論如何,我的問題更多的是技術方面 - 是否有人知道哪些** C/C++說明**我可以用來捕獲Windows 7和/或8中的屏幕,而不是**渲染一些可見的窗口?我正在尋找**等效的分層窗口**(請參閱以下[MSDN鏈接](http://social.msdn.microsoft.com/Forums/zh/vcgeneral/thread/6f1e9f74-ae6e-4df1-92b8- 72e7a98bf58f)爲使用分層窗口的示例) –

1

在windows就連桌面被認爲是一個窗口,並有自己的HWND。 然而,似乎不容易僅僅複製「牆紙」。

所以我基本上看到兩種方法可以做到這一點。 1.複製整個桌面,例如的BitBlt(GetWindowDC(GetDesktopWindow()),...)

OR

  • 使用GetWindow和遍歷向後方向從桌面-窗口,其開始HWND窗口列表你只可以用GetDesktopWindow()確定,就像這樣:

    // paint on a black DC hwnd=GetDesktopWindow() while (hwnd = GetWindow(hwnd, GW_HWNDPREV)) { // is this window not shared? continue // else bitblt it into our dc }

  • 希望我給了一些啓示:-) 如果有人知道阿佤Ÿ如何僅在沒有子窗口的情況下複製桌面請讓我知道。

    +0

    4個月前我已經嘗試過。此方法會爲捕獲某些桌面元素(如開始菜單和工具欄)造成問題。這些將在DC上打印爲黑色,並且沒有創建透明度。 – Vishnu