Как следует из названия, я хотел бы захватить изображение из свернутого окна … это вообще возможно? Я использую 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, чтобы пользователь не видел его, а ОС увидит. И обязательно временно отключите анимацию восстановления / минимизации, используя 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);
}
}
Других решений пока нет …