Ошибка GetWindowDC (NULL) - PullRequest
       13

Ошибка GetWindowDC (NULL)

1 голос
/ 29 апреля 2011

У меня есть функция, которая вызывает GetWindowDC(NULL). и эта функция вызывается разными потоками. иногда я вижу GetWindowDC(NULL) возвращающихся 0x0 Почему? и как решить? функция - мьютекс Так что это не проблема. Нужно ли sleep() несколько мс после каждого звонка? и почему ?

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

MSDN говорит

Возвращаемое значение

Если функция завершается успешно, возвращаемое значение является дескриптором контекста устройства для указанного окна. Если функция завершается ошибкой, возвращаемое значение равно NULL, указывает на ошибку или неверный параметр hWnd.

но Что это означает , означающее ошибку означает, что я не мог понять

Edit:

и я освобождаю все контроллеры домена, а также правильно удаляю контроллеры домена.
Позвонить GetLastError retrns 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 голосов
/ 04 мая 2011

Согласно MSDN не следует звонить DeleteDC на дескриптор, полученный с помощью GetDC Вы должны просто позвонить ReleaseDC.

0 голосов
/ 30 апреля 2011

Не знаю больше подробностей о том, что происходит;сценарий звучит немного странно для меня.Однако ...

Возможно ли, что код также обрабатывает WM_PAINT для того же окна, в то время как вы пытаетесь получить WindowDC?

Я не уверен, что вы можетеполучить окно DC для того же окна, которое активно окрашивается.

...