正如标题所说,我想从最小化的窗口捕捉图像......甚至可能吗?我使用来自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 ++中使用它...
答案 0 :(得分:5)
您无法捕获最小化窗口,您必须先恢复它。但是你可以选择在屏幕外恢复它,或者使用1的alpha不透明度,这样用户就不会看到它,但操作系统会看到它。并且一定要暂时禁用恢复/最小化动画,使用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);
}
}