2016-02-28 71 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)移动不需要窗口虚拟桌面的可见区域外,然后将其移回。

您可能需要枚举监视器才能找到超出所有监视器范围的坐标,这可能会有点麻烦。假设你的截图代码正在计算快照的坐标,所以你可以重新使用这个计算来找到一个安全的地方来停放窗口。