我在编写一个屏幕截取/录制应用程序。以下是捕获屏幕并保存的代码部分:
width = GetSystemMetrics(SM_CXMAXTRACK)+8;
height = GetSystemMetrics(SM_CYMAXTRACK)-8;
hwindowDC=GetDC(GetDesktopWindow());
hwindowCompatibleDC=CreateCompatibleDC(hwindowDC);
SetStretchBltMode(hwindowCompatibleDC,COLORONCOLOR);
// create a bitmap
hbwindow = CreateCompatibleBitmap( hwindowDC, width, height);
cout << " handle to newly created bitmap: " << hbwindow << "\n";
SelectObject(hwindowCompatibleDC, hbwindow); //copy from hwindowCompatibleDC to hbwindow
StretchBlt( hwindowCompatibleDC, 0,0, width, height, hwindowDC, 0, 0,width,height, SRCCOPY); //change SRCCOPY to NOTSRCCOPY for wacky colors !
src.create(height,width,CV_8UC4);
src.empty();
GetDIBits(hwindowCompatibleDC,hbwindow,0,height,src.data,(BITMAPINFO *)&bi,DIB_RGB_COLORS);
DeleteDC(hwindowCompatibleDC);
DeleteObject(hbwindow);
在执行了大约1000次以上的重复后,我的cout语句会显示新创建的句柄为000000000000000即NULL。在那个点之前,我的应用程序都能正常工作。
我每次都要删除已创建的DC和位图,所以没有内存泄漏。任务管理器还证实了没有内存泄漏。那么到底发生了什么呢?
感谢任何能够提供帮助的人。
ReleaseDC(hWindowDC)
。 - WhozCraigGetLastError
。 - n. m.