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); }
//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; }Command what is yours Conquer what is not
所以除非自己捉图后画鼠标,或者通过 DirectX 等直接读取屏幕图像。
{
#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;
}Command what is yours
Conquer what is not
哥们,你的代码太牛B了。谢了啊。