Что не так с PrintWindow? - PullRequest
       6

Что не так с PrintWindow?

0 голосов
/ 05 июня 2011

Что не так со следующим кодом? Почему PrintWindow возвращает 0?

HWND hwnd = GetDesktopWindow();
CHK(hwnd);

HDC hdc = GetWindowDC(hwnd);
CHK(hdc);

if (hdc)
{
    HDC hdcMem = CreateCompatibleDC(hdc);
    CHK(hdcMem);

    if (hdcMem)
    {
        RECT rc;
        CHK(GetWindowRect(hwnd, &rc));

        HBITMAP hbitmap = CreateCompatibleBitmap(hdc, rc.right-rc.left, rc.bottom-rc.top);
        CHK(hbitmap);   

        if (hbitmap)
        {
            SelectObject(hdcMem, hbitmap);

            CHK(PrintWindow(hwnd, hdcMem, 0)); //HERE return 0

            DeleteObject(hbitmap);
        }

        DeleteObject(hdcMem);
    }

    ReleaseDC(hwnd, hdc);
}

Ответы [ 2 ]

2 голосов
/ 05 июня 2011

PrintWindow - довольно тонкая операция.Что он действительно делает, так это отправляет сообщение WM_PRINT в очередь для рассматриваемого окна, в данном случае рабочего стола, и надеется, что это окно ответит на WM_PRINT правильно, если вообще (см. здесь и здесь ).

Я повторил ваше поведение, но я не уверен на 100%, почему оно тоже не работает.Возможно, вы не можете вызвать PrintWindow на HWND, которому не принадлежит ваш процесс, или, возможно, рабочий стол не отвечает на сообщения WM_PRINT.

Вторая ссылка выше содержит комментарий об использовании BitBlt вместо:

Попробуйте получить дескриптор (HWND) для окна рабочего стола - и используйте BitBlt для захвата всего содержимого.Имейте в виду - вы будете захватывать только то, что видно на экране.

Может быть, это помогает.

0 голосов
/ 05 июня 2011

Заменить:

HWND hwnd = GetDesktopWindow();

С:

HWND hwnd = GetDesktopWindow();
hwnd = FindWindowEx( hwnd, 0, _T("Progman"), _T("Program Manager") );

Я не уверен, что получит ли это то, что вы хотите. Если вы хотите сделать скриншот всего текущего рабочего стола (включая все видимые окна верхнего уровня), то BitBlt - это маршрут, по которому вы хотите идти.

Если вы хотите получить панель задач, вы все равно можете использовать этот метод, но вам придется сделать 2 снимка экрана и сшить результаты вместе.

...