2014-01-23 3 views
1

Как говорится в названии, я хотел бы захватить изображение из свернутого окна ... это возможно? Я использую CaptureAnImage из msdn, и он работает, если окно не минимизировано.Захват изображения из свернутого окна

Одно из решений, которое я пробовал, - это максимизировать его, захватить изображение, а затем вернуть его в исходное состояние. Только проблема в том, анимация выглядит некрасиво, и я хотел бы найти альтернативу ... Вот как я попробовал:

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

Вы не можете захватить свернутое окно, вы должны восстановить его первый. Но вы можете по желанию восстановить его за кадром или с альфа-непрозрачностью 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' меняет его –

Смежные вопросы