指定窗口截图

这段代码是网上找来的,自己消化精简了一下。

void CaptureWindow(HWND hwnd)
{


	//获取窗口的width和height

	RECT rect;
	GetWindowRect(hwnd,&rect);	//这个函数得到的是整个窗口的Rect,包括非客户区,而近要得到客户区的rect,请使用GetClientRect
	DWORD width =rect.right-rect.left;
	DWORD height =rect.bottom-rect.top;
	//获取窗口的DC
	HDC hdc = GetWindowDC(hwnd); //如果这里用GetDC(hwnd),则BitBlt出来的是窗口客户区的颜色数据,不包括非客户区

	//创建和屏幕DC兼容的内存DC
	HDC hMemDC=CreateCompatibleDC(hdc);


	//BitBlt能够将一个窗口DC的颜色数据copy到另一个窗口DC中,而存放这些颜色的数据必须是一张位图
	//所以要先创建一张位图

	HBITMAP hBitmap = CreateCompatibleBitmap(hdc,width,height); 

	//因为可以创建很多张位图,你到底要把数据传送到哪一张位图上面呢?  用SelectObject就可以了。
	SelectObject(hMemDC,hBitmap);

	//将屏幕DC中的颜色数据传送到内存DC中的位图上
	BitBlt(hMemDC,0,0,width,height,hdc,0,0,SRCCOPY);


	//将位图放入剪贴板

	//打开剪贴板
	 OpenClipboard(NULL); 
 
	//清空剪贴板内容
	 EmptyClipboard();

	//把位图的信息放到剪贴板上
	 SetClipboardData(CF_BITMAP,hBitmap );


	 CloseClipboard(); 

	ReleaseDC(hwnd,hdc);

	DeleteDC(hMemDC);
	DeleteObject(hBitmap);
}

  

posted @ 2012-08-27 09:19  shremie  阅读(2645)  评论(0编辑  收藏  举报