捕捉屏幕的时候包含鼠标

类别:VC语言 点击:0 评论:0 推荐:

讨论参见http://search.csdn.net/expert/topicview1.asp?id=2307620

默认情况下屏幕捕捉下来的内容不包含鼠标的,但是可以把鼠标画到捉下来的图像里面

LPBITMAPINFOHEADER captureScreenFrame(int left,int top,int width, int height,int tempDisableRect)
{
#ifndef _DIRECTX_captureScreenFrame 
 HDC hScreenDC = ::GetDC(NULL);
#else
 theApp.DirectXInit();
#endif
 
 //if flashing rect
 if (flashingRect && !tempDisableRect) {

  if (autopan) {    
      
   pFrame->SetUpRegion(left,top,width,height,1);    
   DrawFlashingRect( TRUE , 1);   

  }
  else  
   DrawFlashingRect( TRUE , 0);

 } 
 
#ifndef _DIRECTX_captureScreenFrame 
 HDC hMemDC = ::CreateCompatibleDC(hScreenDC);    
 HBITMAP hbm;
 
    hbm = CreateCompatibleBitmap(hScreenDC, width, height);
 HBITMAP oldbm = (HBITMAP) SelectObject(hMemDC, hbm); 
 BitBlt(hMemDC, 0, 0, width, height, hScreenDC, left, top, SRCCOPY);   
#else
 theApp.DirectXCapture(left, top,width, height);
 HDC hMemDC = NULL;
 theApp.DirectXGetDC(hMemDC);
#endif
 
 //Get Cursor Pos
 POINT xPoint;
 GetCursorPos( &xPoint );
 HCURSOR hcur= FetchCursorHandle();
 xPoint.x-=left;
 xPoint.y-=top;

 
 //Draw the HighLight 
 if (g_highlightcursor==1) { 

  POINT highlightPoint;   

  highlightPoint.x = xPoint.x -64 ;
  highlightPoint.y = xPoint.y -64 ;  
  
  InsertHighLight( hMemDC, highlightPoint.x, highlightPoint.y);

 }
 
 //Draw the Cursor 
 if (g_recordcursor==1) {
 
 
  
  ICONINFO iconinfo ; 
  BOOL ret;
  ret = GetIconInfo( hcur,  &iconinfo );
  if (ret) {

   xPoint.x -= iconinfo.xHotspot;
   xPoint.y -= iconinfo.yHotspot;

   //need to delete the hbmMask and hbmColor bitmaps
   //otherwise the program will crash after a while after running out of resource
   if (iconinfo.hbmMask) DeleteObject(iconinfo.hbmMask);
   if (iconinfo.hbmColor) DeleteObject(iconinfo.hbmColor);

  }  
  
  
  ::DrawIcon( hMemDC,  xPoint.x,  xPoint.y, hcur);        

 }
 //CString strText=COleDateTime::GetCurrentTime().Format();
 //CRect rc(0,0,640,480);
    //DrawText(hMemDC,strText,-1,&rc,DT_LEFT);
#ifndef _DIRECTX_captureScreenFrame  
 SelectObject(hMemDC,oldbm);     
 LPBITMAPINFOHEADER pBM_HEADER = (LPBITMAPINFOHEADER)GlobalLock(Bitmap2Dib(hbm, bits)); 
 //LPBITMAPINFOHEADER pBM_HEADER = (LPBITMAPINFOHEADER)GlobalLock(Bitmap2Dib(hbm, 24)); 
#else
 theApp.DirectXReleaseDC(hMemDC);
 LPBITMAPINFOHEADER pBM_HEADER = (LPBITMAPINFOHEADER)GlobalLock(theApp.DirectXGetCaptureBitmap(bits));
#endif
 if (pBM_HEADER == NULL) {
   
  //MessageBox(NULL,"Error reading a frame!","Error",MB_OK | MB_ICONEXCLAMATION);     
  AfxMessageBox(IDS_CAPTURE_FAIL);
  AfxPostQuitMessage(0);
  //exit(1);
 }   
#ifndef _DIRECTX_captureScreenFrame  
 DeleteObject(hbm);   
 DeleteDC(hMemDC); 
#endif 
 //if flashing rect
 if (flashingRect && !tempDisableRect) {
  
  if (autopan) {
   DrawFlashingRect(FALSE , 1);
  }
  else
   DrawFlashingRect(FALSE , 0);

 } 
#ifndef _DIRECTX_captureScreenFrame  
 ReleaseDC(NULL,hScreenDC) ; 
#else
 theApp.DirectXUninit();
#endif
 return pBM_HEADER;   
}

本文地址:http://com.8s8s.com/it/it373.htm