Winapi GetWindowDC(NULL)失败
我有一个调用Winapi GetWindowDC(NULL)失败,winapi,qt4,gdi,Winapi,Qt4,Gdi,我有一个调用GetWindowDC(NULL)的函数。该函数由不同的线程调用。有时我看到GetWindowDC(NULL)返回0x0为什么?如何解决?该函数的互斥设置正确。所以这不是问题。每次通话后我是否需要sleep()几毫秒?为什么 msdn说 返回值 如果函数成功,则返回值是指定窗口的设备上下文的句柄。 如果函数失败,返回值为NULL,表示错误或无效的hWnd参数 但是这表示错误的意味着什么我不明白 编辑: 是的,我正在释放所有跟单信用证,并正确删除跟单信用证 立即调用GetLastEr
GetWindowDC(NULL)
的函数。该函数由不同的线程调用。有时我看到GetWindowDC(NULL)
返回0x0
为什么?如何解决?该函数的互斥设置正确。所以这不是问题。每次通话后我是否需要sleep()
几毫秒?为什么
msdn说
返回值
如果函数成功,则返回值是指定窗口的设备上下文的句柄。
如果函数失败,返回值为NULL,表示错误或无效的hWnd参数
但是这表示错误的意味着什么我不明白
编辑:
是的,我正在释放所有跟单信用证,并正确删除跟单信用证立即调用
GetLastError
retrns0
试过了
不知道正在发生的事情的更多细节;这种情况对我来说有点奇怪。 然而 在您尝试获取WindowDC的同时,代码是否也在为同一窗口处理WM_绘制
我不确定您是否可以为正在进行绘制的同一窗口获取窗口DC。您不应该在使用
GetDC
获取的句柄上调用DeleteDC
。您应该只调用ReleaseDC
。DC的数量有限,您多久调用一次GetWindowDC。。。你是否将其释放回系统?是的,我将在最后释放并删除DCs。这个函数由16个线程同时调用。我数了一下频率。但它似乎经常发生。因此,我应该sleep()
?在函数失败后立即调用GetLastError()
,这将为您提供更多关于发生了什么的信息。@Dave Rager:我刚刚尝试过if(hdc==0x0)qDebug()您曾经解决过这个问题吗?这是桌面窗口上的GetWindowDC(NULL)
我没有从应用程序中执行任何绘制。我已尝试删除DeleteDC
,但问题仍然存在
if(hdc == 0x0)
qDebug() << GetLastError()
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;
}