如何在c++中获得窗口截图作为位图对象

How to get screenshot of a window as bitmap object in C++?

本文关键字:对象 位图 窗口 c++      更新时间:2023-10-16

如何在c++中获得窗口的屏幕截图作为位图对象?假设我已经有了窗户把手。我也想知道是否有可能得到一个窗口的截图时,它在最小化状态?

c++这里指的是带有Windows XP+ (win32)相关库的vc++。

你应该调用printwwindow API:

void CScreenShotDlg::OnPaint()
{
    // device context for painting
    CPaintDC dc(this);
    // Get the window handle of calculator application.
    HWND hWnd = ::FindWindow( 0, _T( "Calculator" ));
    // Take screenshot.
    PrintWindow( hWnd,
                 dc.GetSafeHdc(),
                 0 );
}

看到这个问题:获取窗口截图windows API

如果你不使用MFC,这里是纯printwinwindow签名:

BOOL PrintWindow(
    HWND hwnd,
    HDC hdcBlt,
    UINT nFlags
);

请参阅MSDN了解更多详细信息:http://msdn.microsoft.com/en-us/library/dd162869(v=vs.85).aspx

关于如何将其保存为位图,正如matteo所说,这取决于您使用的实际框架…

编辑:

这里是c++的完整示例

#define _WIN32_WINNT    0x0501        //xp
#include <windows.h>
int main()
{ 
    RECT rc;
    HWND hwnd = FindWindow(TEXT("Notepad"), NULL);    //the window can't be min
    if (hwnd == NULL)
    {
        cout << "it can't find any 'note' window" << endl;
        return 0;
    }
    GetClientRect(hwnd, &rc);
    //create
    HDC hdcScreen = GetDC(NULL);
    HDC hdc = CreateCompatibleDC(hdcScreen);
    HBITMAP hbmp = CreateCompatibleBitmap(hdcScreen, 
        rc.right - rc.left, rc.bottom - rc.top);
    SelectObject(hdc, hbmp);
    //Print to memory hdc
    PrintWindow(hwnd, hdc, PW_CLIENTONLY);
    //copy to clipboard
    OpenClipboard(NULL);
    EmptyClipboard();
    SetClipboardData(CF_BITMAP, hbmp);
    CloseClipboard();
    //release
    DeleteDC(hdc);
    DeleteObject(hbmp);
    ReleaseDC(NULL, hdcScreen);
    cout << "success copy to clipboard, please paste it to the 'mspaint'" << endl;
    return 0;
}

如果有人对最小化窗口的printwwindow图片感兴趣,这里你可以得到这个想法,如何完成这件事:http://www.codeproject.com/Articles/20651/Capturing-Minimized-Window-A-Kid-s-Trick

快乐编码;)

看起来printwwindow正在使用frontbuffer。我试着用IE截图。打开新的链接,并尝试获取图片。它将显示前一个链接的图片。