欢迎光临
未来你我一起携手

VC6下使用PrintWindows截取隐藏窗口图像 C++截图指定窗口句柄

PrintWindow这个函数只可以在XP以上使用,并且在VC6上使用稍有不同。具体请参照下面代码。下面代码基于VC6编译且通过。

#include "stdafx.h"
#include <stdio.h>
#include <afxwin.h>
BOOL  SaveBmp(HBITMAP     hBitmap,   CString     FileName)         
{         
    HDC     hDC;         
    //当前分辨率下每象素所占字节数         
    int     iBits;         
    //位图中每象素所占字节数         
    WORD     wBitCount;         
    //定义调色板大小,     位图中像素字节大小     ,位图文件大小     ,     写入文件字节数             
    DWORD     dwPaletteSize=0,   dwBmBitsSize=0,   dwDIBSize=0,   dwWritten=0;             
    //位图属性结构             
    BITMAP     Bitmap;                 
    //位图文件头结构         
    BITMAPFILEHEADER     bmfHdr;                 
    //位图信息头结构             
    BITMAPINFOHEADER     bi;                 
    //指向位图信息头结构                 
    LPBITMAPINFOHEADER     lpbi;                 
    //定义文件,分配内存句柄,调色板句柄             
    HANDLE     fh,   hDib,   hPal,hOldPal=NULL;             
  
    //计算位图文件每个像素所占字节数             
    hDC  = CreateDC("DISPLAY",   NULL,   NULL,   NULL);         
    iBits  = GetDeviceCaps(hDC,   BITSPIXEL)     *     GetDeviceCaps(hDC,   PLANES);             
    DeleteDC(hDC);             
    if(iBits <=  1)                                                   
        wBitCount = 1;             
    else  if(iBits <=  4)                               
        wBitCount  = 4;             
    else if(iBits <=  8)                               
        wBitCount  = 8;             
    else                                                                                                                               
        wBitCount  = 24;             
  
    GetObject(hBitmap,   sizeof(Bitmap),   (LPSTR)&Bitmap);         
    bi.biSize= sizeof(BITMAPINFOHEADER);         
    bi.biWidth = Bitmap.bmWidth;         
    bi.biHeight =  Bitmap.bmHeight;         
    bi.biPlanes =  1;         
    bi.biBitCount = wBitCount;         
    bi.biCompression= BI_RGB;         
    bi.biSizeImage=0;         
    bi.biXPelsPerMeter = 0;         
    bi.biYPelsPerMeter = 0;         
    bi.biClrImportant = 0;         
    bi.biClrUsed =  0;         
  
    dwBmBitsSize  = ((Bitmap.bmWidth *wBitCount+31) / 32)*4* Bitmap.bmHeight;         
  
    //为位图内容分配内存             
    hDib  = GlobalAlloc(GHND,dwBmBitsSize+dwPaletteSize+sizeof(BITMAPINFOHEADER));             
    lpbi  = (LPBITMAPINFOHEADER)GlobalLock(hDib);             
    *lpbi  = bi;             
  
    //     处理调色板                 
    hPal  = GetStockObject(DEFAULT_PALETTE);             
    if (hPal)             
    {             
        hDC  = ::GetDC(NULL);             
        hOldPal = ::SelectPalette(hDC,(HPALETTE)hPal, FALSE);             
        RealizePalette(hDC);             
    }         
  
    //     获取该调色板下新的像素值             
    GetDIBits(hDC,hBitmap, 0,(UINT)Bitmap.bmHeight,  
        (LPSTR)lpbi+ sizeof(BITMAPINFOHEADER)+dwPaletteSize,   
        (BITMAPINFO *)lpbi, DIB_RGB_COLORS);             
  
    //恢复调色板                 
    if (hOldPal)             
    {             
        ::SelectPalette(hDC,   (HPALETTE)hOldPal,   TRUE);             
        RealizePalette(hDC);             
        ::ReleaseDC(NULL,   hDC);             
    }             
  
    //创建位图文件                 
    fh  = CreateFile(FileName,   GENERIC_WRITE,0,   NULL,   CREATE_ALWAYS,           
        FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN,   NULL);             
  
    if (fh     ==  INVALID_HANDLE_VALUE)         return     FALSE;             
  
    //     设置位图文件头             
    bmfHdr.bfType  = 0x4D42;     //     "BM"             
    dwDIBSize  = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+dwPaletteSize+dwBmBitsSize;                 
    bmfHdr.bfSize  = dwDIBSize;             
    bmfHdr.bfReserved1  = 0;             
    bmfHdr.bfReserved2  = 0;             
    bmfHdr.bfOffBits  = (DWORD)sizeof(BITMAPFILEHEADER)+(DWORD)sizeof(BITMAPINFOHEADER)+dwPaletteSize;             
    //     写入位图文件头             
    WriteFile(fh,   (LPSTR)&bmfHdr,   sizeof(BITMAPFILEHEADER),   &dwWritten,   NULL);             
    //     写入位图文件其余内容             
    WriteFile(fh,   (LPSTR)lpbi,   dwDIBSize,   &dwWritten,   NULL);             
    //清除                 
    GlobalUnlock(hDib);             
    GlobalFree(hDib);             
    CloseHandle(fh);             
  
    return     TRUE;         
}  
HBITMAP GetWindowBitmap(HWND hWnd)
{
	typedef BOOL ( __stdcall *pPrintWindow )(HWND hWnd,HDC hdcBlt,UINT nFlags);
    RECT rect; 
	HMODULE h;
	h = LoadLibrary( "user32.dll" );
	pPrintWindow p;
	if( h )
	{
		p = ( pPrintWindow )::GetProcAddress( h, "PrintWindow" );
	}
    ::GetWindowRect(hWnd,&rect);
    HDC hScrDC=::GetDC(hWnd);                            //创建屏幕DC
    HDC hMemDC=CreateCompatibleDC(hScrDC);                //创建内存DC
    HBITMAP bitmap=::CreateCompatibleBitmap(hScrDC,rect.right-rect.left,rect.bottom-rect.top); //创建兼容位图
    HBITMAP OldBitmap=(HBITMAP)::SelectObject(hMemDC,bitmap);    //把位图选进内存DC
    p(hWnd,hMemDC,0);  
//	HDC d;
//	HWND hw;
//	hw = ::GetDesktopWindow();
//	d = ::GetWindowDC( hw );
//	::BitBlt( d, 0, 0, 1200, 1200, hMemDC, 0, 0, SRCCOPY );
    ::SelectObject(hMemDC,OldBitmap); 
    ::DeleteDC(hMemDC) ;            //删除内存DC
    ::ReleaseDC(NULL,hScrDC) ;    //释放屏幕DC
	SaveBmp(bitmap,"D:\\calc.jpg");
    return bitmap;
}

int main(int argc, char* argv[])
{
	//if(argc<2){printf("缺少参数。");return 0;}
	HWND calc;
	calc=::FindWindow(NULL,"计算器");
	GetWindowBitmap(calc);
	getchar();
	return 0;
}

 

未经允许不得转载:卧栏听雨 » VC6下使用PrintWindows截取隐藏窗口图像
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址