Перейти к содержанию

OpenGl снять скриншот через хук.


Рекомендуемые сообщения

Вообщем вопрос в заголовке. Какую функцию OpenGl нужно хукнуть, что бы получить скриншот того, что показывает игра? (Скажем тот же bmp\png)

 

// объясняю зачем нужно именно так: 1) Игра может быть в полноэкранном режиме 2) Я не имею права скринить то, что поверх игры.

 

 

Спасибо заранее!

Ссылка на комментарий
Поделиться на другие сайты

Привет! Можно, например, через swapbuffer, хотя в точном имени функции я могу ошибаться. Суть в том, чтобы перехватить любую функцию отрисовки, работающую с экранным буфером. Будет доступ к текущему и предыдущему. Оттуда проверяешь, надо ли снять скриншот, затем конвертишь буфер в нужный формат и пишешь в файл.

  • Плюс 1
Ссылка на комментарий
Поделиться на другие сайты

Привет! Можно, например, через swapbuffer, хотя в точном имени функции я могу ошибаться. Суть в том, чтобы перехватить любую функцию отрисовки, работающую с экранным буфером. Будет доступ к текущему и предыдущему. Оттуда проверяешь, надо ли снять скриншот, затем конвертишь буфер в нужный формат и пишешь в файл.

 

когда будут новые видео?)

Ссылка на комментарий
Поделиться на другие сайты

Спасибо! Просто уточню.

Хучим:

void SwapBuffers(HDC hdc)

Потом с HDC выделяем bmp:

int SaveDCToBitmap(HDC hDc, const char *lpszFile, int w, int h) {    HBITMAP hBitmap = CreateCompatibleBitmap(hDc, w, h);    if (hBitmap) {        HANDLE hFile = CreateFile(lpszFile, GENERIC_WRITE, NULL, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);        if (hFile != INVALID_HANDLE_VALUE) {            BITMAPFILEHEADER bfh = {0};            BITMAPINFOHEADER bih = {0};            DIBSECTION ds = {0};            DWORD dwResult = 0;            int nImageSize = w * h * 3;            bfh.bfType = MAKEWORD('B','M');            bfh.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + nImageSize;            bfh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);            WriteFile(hFile, &bfh, sizeof(BITMAPFILEHEADER), &dwResult, NULL);            bih.biSize = sizeof(BITMAPINFOHEADER);            bih.biWidth = w;            bih.biPlanes = 1;            bih.biHeight = h;            bih.biBitCount = 24;            bih.biSizeImage = nImageSize;            bih.biCompression = BI_RGB;            WriteFile(hFile, &bih, sizeof(BITMAPINFOHEADER), &dwResult, NULL);            GetObject(hBitmap, sizeof(DIBSECTION), &ds);            WriteFile(hFile, ds.dsBm.bmBits, nImageSize, &dwResult, NULL);            CloseHandle(hFile);            DeleteObject(hBitmap);        }    }    return 0;}
Ссылка на комментарий
Поделиться на другие сайты

Да, как-то так. Попробуй, заодно и проверишь. Я бы еще запись в файл и формирование формата выкидывал в отдельный поток, куда бы копировал hdc. Скопировать - это быстро, а вот в файл писать - очень медленно.

 

RockHammer - уроки будут, сейчас есть несколько интересных задумок. Беда в том, что задумки есть, а вот времени - мало.

Ссылка на комментарий
Поделиться на другие сайты

×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.