【问题标题】:GetWindowDC(NULL) failingGetWindowDC(NULL) 失败
【发布时间】:2011-08-15 13:26:08
【问题描述】:

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

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

msdn 说

返回值

如果函数成功,则返回值是指定窗口的设备上下文句柄。 如果函数失败,返回值为NULL,表示错误或无效的hWnd参数。

但是这表示错误意味着我无法理解

编辑:

并且是的,我正在释放所有 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;

}

【问题讨论】:

  • DC 的数量有限,您究竟多久调用一次 GetWindowDC? ...您是否将其释放回系统?
  • 是的,我将在最后发布和删除 DC。并且这个函数被16个线程同时调用。我数过几次。但它似乎非常非常频繁。那么我应该sleep() 多久?
  • 在函数失败后立即调用GetLastError()应该会给你更多关于发生了什么的信息。
  • @Dave Rager:我刚刚试了一下。 if(hdc == 0x0)qDebug() &lt;&lt; GetLastError() 它返回 0。那么可能是什么原因造成的呢?
  • 你解决过这个问题吗?

标签: winapi qt4 gdi


【解决方案1】:

According to MSDN 你不应该在使用GetDC 获得的句柄上调用DeleteDC。你应该打电话给ReleaseDC

【讨论】:

  • 我试过删除DeleteDC,但问题仍然存在
【解决方案2】:

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

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

我不确定您是否可以为正在绘制的同一个窗口获得一个窗口 DC。

【讨论】:

  • 这是桌面窗口上的GetWindowDC(NULL) 我没有从我的应用程序执行任何绘画。
猜你喜欢
  • 2015-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-09
  • 2016-03-27
  • 2018-08-24
  • 2022-01-19
相关资源
最近更新 更多