RisimO Опубликовано 8 января, 2015 Поделиться Опубликовано 8 января, 2015 Вообщем вопрос в заголовке. Какую функцию OpenGl нужно хукнуть, что бы получить скриншот того, что показывает игра? (Скажем тот же bmp\png) // объясняю зачем нужно именно так: 1) Игра может быть в полноэкранном режиме 2) Я не имею права скринить то, что поверх игры. Спасибо заранее! Ссылка на комментарий Поделиться на другие сайты Поделиться
keng Опубликовано 8 января, 2015 Поделиться Опубликовано 8 января, 2015 Привет! Можно, например, через swapbuffer, хотя в точном имени функции я могу ошибаться. Суть в том, чтобы перехватить любую функцию отрисовки, работающую с экранным буфером. Будет доступ к текущему и предыдущему. Оттуда проверяешь, надо ли снять скриншот, затем конвертишь буфер в нужный формат и пишешь в файл. 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
RockHammer Опубликовано 8 января, 2015 Поделиться Опубликовано 8 января, 2015 Привет! Можно, например, через swapbuffer, хотя в точном имени функции я могу ошибаться. Суть в том, чтобы перехватить любую функцию отрисовки, работающую с экранным буфером. Будет доступ к текущему и предыдущему. Оттуда проверяешь, надо ли снять скриншот, затем конвертишь буфер в нужный формат и пишешь в файл. когда будут новые видео?) Ссылка на комментарий Поделиться на другие сайты Поделиться
RisimO Опубликовано 8 января, 2015 Автор Поделиться Опубликовано 8 января, 2015 Спасибо! Просто уточню.Хучим: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;} Ссылка на комментарий Поделиться на другие сайты Поделиться
keng Опубликовано 8 января, 2015 Поделиться Опубликовано 8 января, 2015 Да, как-то так. Попробуй, заодно и проверишь. Я бы еще запись в файл и формирование формата выкидывал в отдельный поток, куда бы копировал hdc. Скопировать - это быстро, а вот в файл писать - очень медленно. RockHammer - уроки будут, сейчас есть несколько интересных задумок. Беда в том, что задумки есть, а вот времени - мало. Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения