如何在C++中将窗口的屏幕截图作为位图对象?

jon*_*ham 16 c++ windows window bitmap visual-c++

如何在C++中将窗口的屏幕截图作为位图对象?假设我已经有了窗口句柄.而且我想知道当窗口处于最小化状态时是否可以获取窗口的屏幕截图

这里的C++意味着VC++包含与Windows XP +(win32)相关的所有库.

Dav*_*ras 23

你应该调用PrintWindow 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 );
}
Run Code Online (Sandbox Code Playgroud)

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

如果你没有使用MFC,这里是纯PrintWindow签名:

BOOL PrintWindow(
    HWND hwnd,
    HDC hdcBlt,
    UINT nFlags
);
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参阅MSDN:http://msdn.microsoft.com/en-us/library/dd162869(v = vs.85).aspx

关于如何将其保存为位图asMatteo说取决于你使用的实际框架...

编辑:

这里是原始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;
}
Run Code Online (Sandbox Code Playgroud)

  • @Paul:你可以用'PrintWindow`来截取最小化窗口的截图,只要它正确处理`WM_PRINT`,否则你运气不好. (3认同)
  • 我建议使用GetWindowRect而不是GetClientRect使它在windows7或带有粗边框的vista上更好地工作 (2认同)
  • @davide:上面的代码可以截取某些窗口的完整详细屏幕截图,例如Chrome,记事本等,但是可以截取其他一些图像,例如Visual Studio IDE窗口等。截屏的某些部分完全是黑色的!发生了什么? (2认同)

Ond*_*ouk 6

如果有人有兴趣获得最小化窗口的PrintWindow图片,那么你可以在这里得到想法,如何完成工作:http: //www.codeproject.com/Articles/20651/Capturing-Minimized-Window-A-Kid- S-绝招

快乐的编码;)