GetWindowDC(NULL)失败

时间:2011-04-29 14:30:54

标签: winapi qt4 gdi

我有一个调用GetWindowDC(NULL)的函数。并且该函数由不同的线程调用。有时我会看到GetWindowDC(NULL)返回0x0为什么?以及如何解决?该函数是互斥锁正确的。所以那不是问题。每次通话后我需要sleep()几毫秒吗?为什么?

http://msdn.microsoft.com/en-us/library/dd144947%28v=vs.85%29.aspx

msdn说

  

返回值

     

如果函数成功,则返回值是指定窗口的设备上下文的句柄。   如果函数失败,则返回值为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;

}

2 个答案:

答案 0 :(得分:0)

According to MSDN您不应在使用DeleteDC获得的句柄上调用GetDC。您只需拨打ReleaseDC即可。

答案 1 :(得分:-1)

不知道发生了什么的更多细节;这个场景对我来说听起来有些奇怪。 然而...

在您尝试获取WindowDC的同时,代码是否也可以为同一窗口处理WM_PAINT?

我不确定你是否可以获得正在积极绘制的同一窗口的窗口DC。