PrintScreenしたあとに画像を保存する方法
LRESULT CALLBACK WndProcScreenCapture(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
// MMTIME mm;
// CommonClass Common;
static int id,x,y;
HDC hdc;
PAINTSTRUCT ps;
static HBRUSH hBrush;
HWND desktop;
RECT rc;
static int width,height;
static BITMAPINFO bmpInfo;
static LPDWORD lpPixel;
static HBITMAP hBitmap;
static HDC hMemDC;
FILE *fpt;
int i,j;
//clock_t start,end;
switch (message) {
case WM_CREATE:
desktop=GetDesktopWindow();//デスクトップのハンドルを取得
GetWindowRect(desktop,&rc);//デスクトップのRECT情報を取得
width=rc.right;
height=rc.bottom;
//DIBの情報を設定する
bmpInfo.bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
bmpInfo.bmiHeader.biWidth=width;
bmpInfo.bmiHeader.biHeight=height;
bmpInfo.bmiHeader.biPlanes=1;
bmpInfo.bmiHeader.biBitCount=32;
bmpInfo.bmiHeader.biCompression=BI_RGB;
//DIBSection作成
hdc=GetDC(hWnd);
hBitmap=CreateDIBSection(hdc,&bmpInfo,DIB_RGB_COLORS,(void**)&lpPixel,NULL,0);
hMemDC=CreateCompatibleDC(hdc);
SelectObject(hMemDC,hBitmap);
ReleaseDC(hWnd,hdc);
fopen_s(&fpt,"20090715.raw","wb");
fwrite((void**)&lpPixel[0],sizeof(unsigned char),width*height,fpt);
/* DIBSectionにグラデーション描画 */
for (i = 0;i < height;i++) {
for (j = 0;j <width;j++) {
#if 0
/* DIBピクセル列に直接アクセス */
lpPixel[i + j * 256] = (i << 16);
lpPixel[i + (j + 32) * 256] = (i << 8);
lpPixel[i + (j + 64) * 256] = i;
lpPixel[i + (j + 96) * 256] = (i << 16) | (i << 8) | i;
/* GDI経由で描画 */
SetPixel(hMemDC, i, j + 128, RGB(i, 0, 0));
SetPixel(hMemDC, i, j + 128 + 32, RGB(0, i, 0));
SetPixel(hMemDC, i, j + 128 + 64, RGB(0, 0, i));
SetPixel(hMemDC, i, j + 128 + 96, RGB(i, i, i));
#endif
}
}
//fwrite(&(bmpInfo.bmiHeader),sizeof(unsigned char),40,fpt);
//fwrite((void**)&lpPixel,sizeof(unsigned char),width*height,fpt);
//fwrite(&(bmpInfo.bmiColors),sizeof(unsigned char),width*height,fpt);
fclose(fpt);
//スクリーンをDIBSectionにコピー
hdc=GetDC(desktop);
BitBlt(hMemDC,0,0,width,height,hdc,0,0,SRCCOPY);
ReleaseDC(desktop,hdc);
break;
case WM_DESTROY:
//自らlpPixelを解放するべからず
DeleteDC(hMemDC);
DeleteObject(hBitmap); //BMPを削除した時、lpPixelも自動的に解放される
PostQuitMessage(0);
break;
case WM_PAINT:
hdc=BeginPaint(hWnd,&ps);
BitBlt(hdc,0,0,width,height,hMemDC,0,0,SRCCOPY);
EndPaint(hWnd,&ps);
break;
case WM_CHAR:
の様に書いて、windowにキャプチャ画像を表示することは
できたのですが、
この画像の画像情報のピクセルのポインタはどれなのでしょうか?
画像をraw形式でもいいので保存したいのですが、
どうしたら、キャプチャした画像を ファイルとして保存
できますか? //fwrite((void**)&lpPixel,sizeof(unsigned char),width*height,fpt);
ではうまくいきませんでした。
お礼
まだシステムを理解していなかったため、補足に記述してしまいましたが・・・ 丁寧なご説明ありがとうございました。2パターンの説明がどちらもわかりやすかったです。
補足
.NETのTimerクラスを用いて実装してみたいと思います。丁寧なご回答本当にありがとうございます。