屏幕抓图至少分为3个步骤: (1) 启用鼠标指针捕获。 (2) 在鼠标指针所在处的窗口进行绘图,提示抓图的目标。 (3) 选定目标窗口时,将目标窗口的画面保存为自定义的位图并终止鼠标指针捕获。 以下是具体的编程步骤: (1)在Visual C++ .NET中按照GDI+程序的框架新建一个基于对话框的项目ScreenCapture,然后准备好一个外形为相机的光标文件(*.cur),将之引入资源管理器(IDC_CAMERA)。接着在CScreenCaptureDlg类中加入以下两个全局变量: HWND hwndCapture; Crect rectCapture; (2)通过类向导加入对WM_MOUSEMOVE及WM_LBUTTONUP事件的响应函数,分别如下所示。 void CScreenCaptureDlg::OnMouseMove(UINT nFlags, CPoint point) { //如果用户按隹鼠标左键不放,则开始抓取图片 if(nFlags==MK_LBUTTON){ //隐藏程序窗口,以免影响在抓取时的“视野” ShowWindow(SW_HIDE); //载入“照相机”鼠标指针,开始追踪鼠标指针的移动 HCURSOR cur=LoadCursor(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDC_CAMERA)); SetCursor(cur); SetCapture(); //获得鼠标指针所在窗口的句柄 this->ClientToScreen(&point); hwndCapture=(HWND)::WindowFromPoint(point); //取得屏幕的设备环境句柄,以便在屏幕的任何位置绘图 HDC hDC=::GetDC(NULL); //建立一个红色的画笔 HPEN hPen=CreatePen(PS_INSIDEFRAME,6,RGB(255,0,0)); //将绘图模式设为R2_NOTXORPEN,在绘图时可以不破坏原有的背景 int nMode=SetROP2(hDC,R2_NOTXORPEN); HPEN hpenOld=(HPEN)SelectObject(hDC,hPen); //得到鼠标指针所在窗口的区域 ::GetWindowRect(hwndCapture,&rectCapture); //在鼠标指针所在处的窗口四周画一红色的矩形,做为选定时的提示 POINT pt[5]; pt[0]=CPoint(rectCapture.left,rectCapture.top); pt[1]=CPoint(rectCapture.right,rectCapture.top); pt[2]=CPoint(rectCapture.right,rectCapture.bottom); pt[3]=CPoint(rectCapture.left,rectCapture.bottom); pt[4]=CPoint(rectCapture.left,rectCapture.top); ::Polyline(hDC,pt,5); //延时后再重绘红色矩形,这样不会破坏原有的内容 Sleep(100); ::Polyline(hDC,pt,5); ::SelectObject(hDC,hpenOld); ::ReleaseDC(NULL,hDC); } CDialog::OnMouseMove(nFlags, point); } void CScreenCaptureDlg::OnLButtonUp(UINT nFlags, CPoint point) { // 得到鼠标指针所在窗口的区域宽、高 int nWidth=rectCapture.Width(); int nHeight=rectCapture.Height(); HDC hdcScreen,hMemDC; HBITMAP hBitmap,hOldBitmap; //建立一个屏幕设备环境句柄 hdcScreen=CreateDC("DISPLAY",NULL,NULL,NULL); hMemDC=CreateCompatibleDC(hdcScreen); //建立一个与屏幕设备环境句柄兼容、与鼠标指针所在窗口的区域等大的位图 hBitmap=CreateCompatibleBitmap(hdcScreen,nWidth,nHeight); //把新位图选到内存设备描述表中 hOldBitmap=(HBITMAP)SelectObject(hMemDC,hBitmap); //把屏幕设备描述表拷贝到内存设备描述表中 BitBlt(hMemDC,0,0,nWidth,nHeight,hdcScreen,rectCapture.left,rectCapture.top,SRCCOPY); DeleteDC(hdcScreen); DeleteDC(hMemDC); //返回位图句柄 //打开剪贴板,并将位图拷到剪贴板上 OpenClipboard(); EmptyClipboard(); SetClipboardData(CF_BITMAP,hBitmap); //关闭剪贴板 CloseClipboard(); MessageBox("屏幕内容已经拷到剪贴板!"); ReleaseCapture(); //恢复窗口显示模式 ShowWindow(SW_NORMAL); CDialog::OnLButtonUp(nFlags, point); } 至此,一个具有专业效果的屏幕抓图程序的核心已经搞定。