2014-01-23 27 views
1

正如標題所說,我想從最小化的窗口捕捉圖像...甚至有可能嗎?我使用msdn中的CaptureAnImage,它工作,除非窗口最小化。從最小化的窗口捕捉圖像

我試過的一個解決方案是最大化它,捕獲圖像,然後返回到它的原始狀態。唯一的問題是動畫長相醜陋,我想找到一種替代......這裏是我試了一下:

WINDOWPLACEMENT wInfo; 
UINT originalPlacement; 

GetWindowPlacement(hWnd, &wInfo); 
originalPlacement = wInfo.showCmd; 

wInfo.showCmd = SW_MAXIMIZE; 
SetWindowPlacement(hWnd, &wInfo); 
wInfo.showCmd = originalPlacement; 

CaptureAnImage(hWnd); // Capture the image while it's maximized 

SetWindowPlacement(hWnd, &wInfo); 

所以在這裏我在尋找這些解決方案之一:

即使在最小化的情況下也能拍攝圖像嗎?

是否有可能將其最大化,抓住它,然後將其返回到它沒有表現出任何的動畫原來的狀態?

PS:我發現link同時尋找我的問題,但它是在C#中,我無法使它在C++工作...

回答

5

您不能捕獲一個最小化的窗口,你必須恢復它第一。但是,您可以選擇將其恢復到屏幕外或alpha不透明度爲1的位置,以便用戶不會看到它,但操作系統會執行此操作。並且一定要暫時禁用還原/最小化動畫,並使用SystemParametersInfo(SPI_SETANIMATION)(只有在啓用了SPI_GETANIMATION報告動畫的情況下才會這樣做)來減少顯示然後重新隱藏窗口所需的時間。

例如:

WINDOWPLACEMENT wp = {0}; 
wp.length = sizeof(WINDOWPLACEMENT); 
GetWindowPlacement(hWnd, &wp); 

ANIMATIONINFO ai = {0}; 
bool restoreAnimated = false; 

if (wp.showCmd == SW_SHOWMINIMIZED) 
{ 
    ai.cbSize = sizeof(ANIMATIONINFO); 
    SystemParametersInfo(SPI_GETANIMATION, sizeof(ANIMATIONINFO), &ai, 0); 

    if (ai.iMinAnimate != 0) 
    { 
     ai.iMinAnimate = 0; 
     SystemParametersInfo(SPI_SETANIMATION, sizeof(ANIMATIONINFO), &ai, 0); 
     restoreAnimation = true; 
    } 

    // optionally move the window off-screen, or 
    // apply alpha using SetLayeredWindowAttributes()... 

    ShowWindow(hWnd, SW_SHOWNOACTIVATE); 
} 

// capture as needed ... 

if (wp.showCmd == SW_SHOWMINIMIZED) 
{ 
    SetWindowPlacement(hWnd, &wp); 

    // optionally remove alpha using SetLayeredWindowAttributes()... 

    if (restoreAnimation) 
    { 
     ai.iMinAnimate = 1; 
     SystemParametersInfo(SPI_SETANIMATION, sizeof(ANIMATIONINFO), &ai, 0); 
    } 
} 
+0

就像我說的,使用'SystemParametersInfo()'爲。 'SPI_GETANIMATION'檢索當前的動畫狀態,'SPI_SETANIMATION'改變它 –