|
画面を BMP として取り込む(マルチスクリーン対応) |
| ダウンロード : スクリーンキャプチャサンプル(2007/01/14) |
|
// マウスポインタ位置のモニタハンドルを取得する POINT posMouse; ::GetCursorPos(&posMouse); HMONITOR hMonitor = ::MonitorFromPoint(posMouse, MONITOR_DEFAULTTONEAREST); |
|
// モニタの情報を取得する MONITORINFOEX stMonInfoEx; stMonInfoEx.cbSize = sizeof(stMonInfoEx); ::GetMonitorInfo(hMonitor, &stMonInfoEx); // 目的のデバイスコンテキストを取得する HDC hDC = ::CreateDC(TEXT("DISPLAY"), stMonInfoEx.szDevice, NULL, NULL); int nMonW = stMonInfoEx.rcMonitor.right - stMonInfoEx.rcMonitor.left; // 横幅 int nMonH = stMonInfoEx.rcMonitor.bottom - stMonInfoEx.rcMonitor.top; // 縦幅 |
|
// DIB 画像格納用メモリを取得する LPBITMAPINFO lpDIB = (LPBITMAPINFO)::GlobalAlloc(GPTR, sizeof(BITMAPINFO)); // DIBSection の BITMAPINFO を初期化する ::ZeroMemory(&lpDIB->bmiHeader, sizeof(BITMAPINFOHEADER)); lpDIB->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); lpDIB->bmiHeader.biWidth = nMonW; lpDIB->bmiHeader.biHeight = nMonH; lpDIB->bmiHeader.biPlanes = 1; lpDIB->bmiHeader.biBitCount = 24; lpDIB->bmiHeader.biCompression = BI_RGB; lpDIB->bmiHeader.biSizeImage = nMonW * nMonH * 3; // 24bit Color フル画面 // 画面キャプチャ用の DIBSection を作成する LPBYTE lpBMP; HBITMAP hDIB = ::CreateDIBSection( hDC, lpDIB, DIB_RGB_COLORS, (LPVOID*)&lpBMP, NULL, 0 ); |
|
// 画面全体を DIB にコピーする HDC hMemDC = ::CreateCompatibleDC(hDC); HGDIOBJ hOldDIB = ::SelectObject(hMemDC, hDIB); ::BitBlt(hMemDC, 0, 0, nMonW, nMonH, hDC, 0, 0, SRCCOPY); |
|
// BMP ファイルヘッダー部分を初期化する BITMAPFILEHEADER bmFileHeader = { (WORD)(TEXT('B') | TEXT('M') << 8) }; LPBITMAPINFOHEADER pbmInfoHeader = &lpDIB->bmiHeader; bmFileHeader.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER); bmFileHeader.bfSize = bmFileHeader.bfOffBits + pbmInfoHeader->biSizeImage; // bmp として保存する // pzPath : 保存するファイルパスが格納されている配列の先頭ポインタ DWORD dwSize; HANDLE hFile = ::CreateFile( szPath, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL ); ::WriteFile(hFile, &bmFileHeader, sizeof(BITMAPFILEHEADER), &dwSize, NULL); ::WriteFile(hFile, lpDIB, sizeof(BITMAPINFOHEADER), &dwSize, NULL); ::WriteFile(hFile, lpBMP, lpDIB->bmiHeader.biSizeImage, &dwSize, NULL); // ファイルを閉じる ::CloseHandle(hFile); |
|
// 後片付け ::SelectObject(hMemDC, hOldDIB); ::DeleteDC(hDC); ::DeleteDC(hMemDC); ::DeleteObject(hDIB); ::GlobalFree(lpDIB); |