从最小化的窗口捕获图像

MyU*_*358 1 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);
Run Code Online (Sandbox Code Playgroud)

所以我在这里寻找其中一个解决方案:

是否有可能在图像最小化时捕获图像?

要么

是否可以最大化它,捕获它,然后将其恢复到原始状态而不显示任何类型的动画?

PS:我在搜索我的问题时找到了链接,但它在c#中,我无法在c ++中使用它...

Rem*_*eau 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);
    }
}
Run Code Online (Sandbox Code Playgroud)