Захват изображения из свернутого окна

Как следует из названия, я хотел бы захватить изображение из свернутого окна … это вообще возможно? Я использую 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: я обнаружил, что ссылка на сайт пока ищу мою проблему, но она в c # и я не могу заставить ее работать в c ++ …

1

Решение

Вы не можете захватить свернутое окно, вы ДОЛЖНЫ сначала восстановить его. Но вы можете по желанию восстановить его за пределами экрана или с непрозрачностью альфа 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);
}
}
5

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]