C++でビットマップオブジェクトとしてウィンドウのスクリーンショットを取得するにはどうすればよいですか?私はすでにウィンドウハンドルを持っていると仮定します。 そして、最小化された状態のときにウィンドウのスクリーンショットを取得できるかどうかも知りたいです?
ここでのC++とは、Windows XP +(win32)に関連付けられているすべてのライブラリを備えたVC++を意味します。
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;
}
最小化されたウィンドウのPrintWindow画像を取得することに興味がある人は、ここでアイデアを得ることができます。その方法は次のとおりです。 http://www.codeproject.com/Articles/20651/Capturing-Minimized-Window- A-Kid-s-Trick
ハッピーコーディング;)
PrintWindowがfrontbufferで動作しているようです。 IEスクリーンショットを撮ろうとしました。新しいリンクを開いて、写真を取得してみてください。前のリンクの写真が表示されます。