web-dev-qa-db-ja.com

C ++でビットマップオブジェクトとしてウィンドウのスクリーンショットを取得するにはどうすればよいですか?

C++でビットマップオブジェクトとしてウィンドウのスクリーンショットを取得するにはどうすればよいですか?私はすでにウィンドウハンドルを持っていると仮定します。 そして、最小化された状態のときにウィンドウのスクリーンショットを取得できるかどうかも知りたいです

ここでのC++とは、Windows XP +(win32)に関連付けられているすべてのライブラリを備えたVC++を意味します。

17
jondinham

printWindowAPIを呼び出す必要があります。

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

この質問を参照してください: ウィンドウスクリーンショットウィンドウAPIの取得

mFCを使用していない場合は、ここに純粋なPrintWindow署名があります。

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;
}
24
Davide Piras

最小化されたウィンドウのPrintWindow画像を取得することに興味がある人は、ここでアイデアを得ることができます。その方法は次のとおりです。 http://www.codeproject.com/Articles/20651/Capturing-Minimized-Window- A-Kid-s-Trick

ハッピーコーディング;)

7
Ondřej Vykouk

PrintWindowがfrontbufferで動作しているようです。 IEスクリーンショットを撮ろうとしました。新しいリンクを開いて、写真を取得してみてください。前のリンクの写真が表示されます。

2
vik_78