Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: скриншот с окна Internet Explorer 8  (Прочитано 5752 раз)
0 Пользователей и 1 Гость смотрят эту тему.
UginL7
Новенький

ua
Offline Offline

« : 18-08-2010 06:50 » 

есть код, который делает снимок с окна IE(причём полностью всего, а не только содержимого страницы - надо именно так) .
Всё хорошо работает снимок делается, в файлик записывается, но тут оказывается интересный момент, что на IE 6 — всё отлично работает, а на IE 8 — от случая к случаю, т.е. например, если открыт сайт youip.ru — всё будет хорошо, а вот если в строку адреса передать, например mail.ru или yandex.ru — то отобразит всё, кроме содержимого страницы, на этом месте будет чёрный квадрат, причём не всегда. Может отработать корректно и всё будет отлично.
вот код, которым делаю снимок и сохраняю в файл.

Код:
hFind — HANDLE окна(ИЕ), 
RECT rcWnd;
HDC hDCMem;
HBITMAP hBmMem;
HGDIOBJ hBmOld;
HDC hDCScr;
PBYTE pBmData;
PBITMAPINFO pBmInf;
HANDLE hFile;
int nResult = 0;
WORD wWidth;
WORD wHeight;

GetWindowRect(hFind, &rcWnd );
wWidth = (rcWnd.right - rcWnd.left);
wHeight = (rcWnd.bottom - rcWnd.top);
   
hDCScr = GetDC(hFind);
hDCMem = CreateCompatibleDC(NULL);
hBmMem = CreateCompatibleBitmap(hDCScr, (rcWnd.right - rcWnd.left), (rcWnd.bottom - rcWnd.top));
hBmOld = SelectObject(hDCMem, hBmMem);

PrintWindow( hFind, hDCMem, 0);

BitBlt(hDCScr,  rcWnd.left, rcWnd.top, wWidth, wHeight, hDCMem, 0, 0, SRCCOPY);
pBmInf = (PBITMAPINFO)VirtualAlloc(NULL, sizeof(BITMAPINFO), MEM_COMMIT|MEM_RESERVE, PAGE_READWRITE);

if(hDCMem != NULL && hBmMem != NULL && pBmInf != NULL)
{
    pBmInf->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
    pBmInf->bmiHeader.biWidth = wWidth;
    pBmInf->bmiHeader.biHeight = wHeight;
    pBmInf->bmiHeader.biCompression = BI_RGB;
    pBmInf->bmiHeader.biBitCount = 24;
    pBmInf->bmiHeader.biClrUsed = 16777216;
    pBmInf->bmiHeader.biPlanes = 1;

    pBmInf->bmiHeader.biSizeImage = (wWidth + 7) / 8 * wHeight * 24;
    pBmData = (PBYTE)VirtualAlloc(NULL, pBmInf->bmiHeader.biSizeImage, MEM_COMMIT|MEM_RESERVE, PAGE_READWRITE);
    if(pBmData != NULL)
    {
        if(GetDIBits(hDCMem, hBmMem, 0, wHeight, pBmData, pBmInf, DIB_RGB_COLORS))
        {
            BITMAPFILEHEADER BmFileHdr;
            BmFileHdr.bfType = 0x4D42;
            BmFileHdr.bfReserved1 = BmFileHdr.bfReserved2 = 0;
            BmFileHdr.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
            BmFileHdr.bfSize = BmFileHdr.bfOffBits + pBmInf->bmiHeader.biSizeImage;   

            hFile = CreateFile(sFilePath, GENERIC_WRITE, FILE_SHARE_WRITE,    NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_HIDDEN, NULL);
            if(hFile != INVALID_HANDLE_VALUE)
            {
                DWORD dwBytes = 0;
                WriteFile(hFile, &BmFileHdr, sizeof(BITMAPFILEHEADER), &dwBytes, NULL);
                WriteFile(hFile, pBmInf, sizeof(BITMAPINFOHEADER), &dwBytes, NULL);
                WriteFile(hFile, pBmData, pBmInf->bmiHeader.biSizeImage, &dwBytes, NULL);
                FlushFileBuffers(hFile);
                CloseHandle(hFile);
            }
            else
                nResult = -5;
        }
        else
            nResult = -6;
        if (pBmData != NULL)
            VirtualFree(pBmData, 0, MEM_RELEASE);
    }
    else
        nResult = -7;
}
else
    nResult = -8;
if(pBmInf != NULL)
VirtualFree(pBmInf, 0, MEM_RELEASE);
SelectObject(hDCMem, hBmOld);
DeleteDC(hDCMem);
DeleteObject(hBmMem);
return nResult;

Пожалуйста подскажите, почему так.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #1 : 18-08-2010 06:53 » 

Наверное, окно ещё не успело отрисоваться. Попробуй проверять случай, когда получились одни чёрные пикселы - и повторить снова
Записан

UginL7
Новенький

ua
Offline Offline

« Ответ #2 : 18-08-2010 07:07 » 

Проверял, окно к тому времени прорисовываться успевает.   
Записан
zubr
Гость
« Ответ #3 : 18-08-2010 12:17 » 

Окно IE - это не просто окно, это OLE-объект. Я бы получал скриншот, используя интерфейс IViewObject.
Порядок действий таков:
1. Перехватить экземпляр IE. Включай поиск на форуме - подобный вопрос уже обсуждался, есть пример на codeproject.com
2. После загрузки получаем интерфейс документа IHTMLDocument2
3. Через QueryInterface получаем интерфейс  IViewObject документа.
4. Используя метод IViewObject::Draw рисуем содержание страницы в свой битмап.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines