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
retrns
0
试过了


不知道正在发生的事情的更多细节;这种情况对我来说有点奇怪。 然而

在您尝试获取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;

}