从最小化的窗口捕获图像

时间:2014-01-23 00:26:43

标签: c++ winapi image-capture

正如标题所说,我想从最小化的窗口捕捉图像......甚至可能吗?我使用来自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 ++中使用它...

1 个答案:

答案 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);
    }
}