2016-02-28 47 views
4

在我的C++應用程序,我有以下代碼:的ShowWindow()SW_HIDE窗口即刻,不影響

ShowWindow(hDlg, SW_HIDE); 
MakeScreenshot(); 
ShowWindow(hDlg, SW_SHOW); 

這應該捕獲屏幕截圖沒有當前應用程序窗口。但是有一個問題。 SW_HIDE需要一些時間,因爲我的Windows 8.1被配置爲使用動畫效果。所以窗口的隱藏大約需要400毫秒,如果在這個時間間隔(它是)捕獲屏幕截圖,它也將包含應用程序本身的窗口,這是我不喜歡的。

有沒有什麼辦法可以立即隱藏當前窗口,所以它不會被包含在創建截圖函數中,這個函數在它之後立即被調用?如果沒有,有沒有其他的首選方式如何截取Windows桌面的截圖,不包括應用程序本身?在MakeScreenshot之前添加延遲並不是一個好的解決方案。謝謝。

+0

https://msdn.microsoft.com/en-us/library/windows/desktop/aa969524%28v=vs.85%29.aspx –

+0

@HansPassant:你在想的'DWMWA_CLOAK'屬性? –

+0

@Tomas:嘗試使用SystemParametersInfo()在隱藏窗口之前禁用動畫,並在顯示窗口後重新啓用動畫。或者在窗口上啓用'WS_EX_LAYERED'樣式,然後將其不透明度設置爲0,然後返回到255.或者,將窗口移出屏幕然後將其移回。 –

回答

0

什麼工作對我來說:

this->ModifyStyleEx(0, WS_EX_LAYERED | WS_EX_TOPMOST); //just a backup 


    COLORREF c; 
    BYTE b; 
    DWORD flags; 
    this->GetLayeredWindowAttributes(&c, &b, &flags); //just a backup 

    this->SetLayeredWindowAttributes(0, 0, LWA_ALPHA); 


    //CODE TO TAKE A SCREENSHOT 


    this->SetLayeredWindowAttributes(c, b, flags); //just a restore 

    this->ModifyStyleEx(WS_EX_LAYERED | WS_EX_TOPMOST, 0); //just a restore 
0

你可以使用的MoveWindow(或SetWindowsPos)移動不需要窗口虛擬桌面的可見區域外,然後將其移回。

您可能需要枚舉監視器才能找到超出所有監視器範圍的座標,這可能會有點麻煩。假設你的截圖代碼正在計算快照的座標,所以你可以重新使用這個計算來找到一個安全的地方來停放窗口。

相關問題