我有一个调用GetWindowDC(NULL)
的函数。并且该函数由不同的线程调用。有时我会看到GetWindowDC(NULL)
返回0x0
为什么?以及如何解决?该函数是互斥锁正确的。所以那不是问题。每次通话后我需要sleep()
几毫秒吗?为什么?
http://msdn.microsoft.com/en-us/library/dd144947%28v=vs.85%29.aspx
返回值
如果函数成功,则返回值是指定窗口的设备上下文的句柄。 如果函数失败,则返回值为NULL,表示错误或无效的hWnd参数。
但表示错误意味着我无法理解
和Ya我正在释放所有DC并正确删除DC
立即致电GetLastError
后续0
试过。
if(hdc == 0x0)
qDebug() << GetLastError()
这是我的源代码。 工作,但工作超过100次(35-40秒)后,它拒绝工作,GetWindowDC(NULL)
返回0
QPixmap Util::grabScreen(const DG::Rect* rect){
mutex.lock();
HDC hdc=GetWindowDC(NULL);
HWND win=WindowFromDC(hdc);
HDC cdc=CreateCompatibleDC(hdc);
HBITMAP temp=CreateCompatibleBitmap(hdc,rect->width,rect->height);
PAINTSTRUCT ps;
hdc=BeginPaint(win,&ps);
HBITMAP oldb=(HBITMAP)SelectObject(cdc,temp);
BitBlt(cdc,0,0,rect->width,rect->height,hdc,rect->top,rect->left,SRCCOPY);
SelectObject(cdc,oldb);
EndPaint(win,&ps);
char* buff;
buff = new char[rect->size()];
GetBitmapBits(temp,rect->size(),buff);
qDebug() << "temp" << temp;
if(temp == 0x0){
qDebug() << "hdc" << hdc;
}
DeleteDC(cdc);
ReleaseDC(NULL, hdc);
DeleteDC(hdc);
QPixmap pixmap = QPixmap::fromWinHBITMAP(temp);
//QPixmap pixmap = QPixmap::grabWidget(desktopWidget,rect->toQRect());
mutex.unlock();
return pixmap;
}
答案 0 :(得分:0)
According to MSDN您不应在使用DeleteDC
获得的句柄上调用GetDC
。您只需拨打ReleaseDC
即可。
答案 1 :(得分:-1)
不知道发生了什么的更多细节;这个场景对我来说听起来有些奇怪。 然而...
在您尝试获取WindowDC的同时,代码是否也可以为同一窗口处理WM_PAINT?
我不确定你是否可以获得正在积极绘制的同一窗口的窗口DC。