【问题标题】:Capturing an image from a minimized window从最小化窗口捕获图像
【发布时间】:2014-01-23 00:26:42
【问题描述】:

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

【问题讨论】:

    标签: c++ winapi image-capture


    【解决方案1】:

    您无法捕获最小化的窗口,您必须先恢复它。但是您可以选择在屏幕外恢复它,或者 alpha 不透明度为 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);
        }
    }
    

    【讨论】:

    • 如果窗口被最小化,当我们将鼠标光标悬停在任务栏上的图标上时,Windows 操作系统会在显示窗口屏幕的图标上方弹出一个小窗口,Windows 操作系统是否在执行您的代码在幕后? :)
    • @Shayan 没有。最小化的窗口实际上并没有最小化,它在操作系统级别被移出屏幕。 Windows 仍然可以渲染它,只是用户看不到它。如果需要,任务栏还允许应用程序呈现自己的窗口预览。因此,该应用程序可以将最小化的窗口呈现为位图以供任务栏显示。
    猜你喜欢
    • 2015-01-17
    • 1970-01-01
    • 2010-10-24
    • 1970-01-01
    • 1970-01-01
    • 2011-05-22
    • 2012-03-15
    • 2015-07-21
    • 2010-12-08
    相关资源
    最近更新 更多