Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.05.2020, 13:05   #1
Android1
Форумчанин
 
Регистрация: 26.08.2010
Сообщений: 121
По умолчанию Скриншот рабочего стола на WinApi

Здравствуйте,

Подскажите пожалуйста, как можно сделать скриншот рабочего стола на WinApi и получить доступ к массиву байтов для чтения ?

Вот делаю, как подсказали:
Код:
HDC HDC_Screen = GetDC(NULL);          //Создаю контекст экрана рабочего стола

HDC HDC_CreateCompatibleDC = CreateCompatibleDC(HDC_Screen);  //Создаю совместимый контекст в памяти с HDC_Screen.



//Создаю DIB-битмап (CreateDIBSection):
//////////////////////////////////////////
BITMAPINFO My_struct_BITMAPINFO;

My_struct_BITMAPINFO.bmiHeader.biSize = sizeof(My_struct_BITMAPINFO.bmiHeader);
My_struct_BITMAPINFO.bmiHeader.biWidth = 1920;
My_struct_BITMAPINFO.bmiHeader.biHeight = 1080;
My_struct_BITMAPINFO.bmiHeader.biPlanes = 1;
My_struct_BITMAPINFO.bmiHeader.biBitCount = 32;
My_struct_BITMAPINFO.bmiHeader.biCompression = BI_RGB;
My_struct_BITMAPINFO.bmiHeader.biSizeImage = 0; ////--------
//My_struct_BITMAPINFO.bmiHeader.biXPelsPerMeter =
//My_struct_BITMAPINFO.bmiHeader.biYPelsPerMeter =
My_struct_BITMAPINFO.bmiHeader.biClrUsed = 0;
My_struct_BITMAPINFO.bmiHeader.biClrImportant = 0;

//My_struct_BITMAPINFO.bmiColors =
//////////////////////////////////////////

unsigned char* my_DIB_data=0;

HBITMAP HBITMAP_DIBSection = CreateDIBSection(HDC_Screen, &My_struct_BITMAPINFO, DIB_RGB_COLORS, (VOID**)&my_DIB_data, NULL, NULL);  //my_DIB_data - этому указателю теоретически должен был присвоиться выделенный функцией CreateDIBSection - пустой участок памяти для дальнейшего заполнения.



SelectObject(HDC_CreateCompatibleDC, HBITMAP_DIBSection);   //Выбираю битмап в контекст в памяти


BOOL my_BitBlt = BitBlt(HDC_CreateCompatibleDC, 0, 0, 1000, 1000, HDC_Screen, 0, 0, SRCCOPY | CAPTUREBLT);  //Якобы копирую пиксели из контекста экрана в контекст памяти

cout << "Bool: " << my_BitBlt << endl;  //Отличное от нуля, значит функция завершилась успешно


for (int i = 0; i < 1000; i++)
{
  cout << (int)my_DIB_data[i] << endl;  //Проверяю есть ли какие то значения, заполнились ли они.
}
Однако по указателю my_DIB_data - все пусто, одни нули

Я уже не знаю, что не так, что не так я делаю ?
Android1 вне форума Ответить с цитированием
Старый 17.05.2020, 12:23   #2
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

У меня есть код на Delphi. Могу скинуть. Перепишете его на С
Правда там не совсем WinAPI, но принцип тот же.
BLACK_RAIN вне форума Ответить с цитированием
Старый 18.05.2020, 10:52   #3
NetSpace
Участник клуба
 
Аватар для NetSpace
 
Регистрация: 03.06.2009
Сообщений: 1,789
По умолчанию

где-то в темах есть про скриншотеры. там выложено несколько работающих исходников, в том числе и на WinAPI.
откуда знаю? просто в той теме задавал вопрос про увеличение скорости записи. мне там ещё дали несколько быстрых библиотек для работы с JPEG.
Программирование - это единственный способ заставить компьютер делать то, что тебе хочется, а не то, что приходится.
NetSpace вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вызов контекстного меню рабочего стола - C++ WinAPI t35skler Помощь студентам 2 01.06.2017 11:09
скриншот иконок рабочего стола DJDrugsounD Общие вопросы Delphi 1 19.02.2015 15:49
Скриншот рабочего стола по координатам формы Winexcel Общие вопросы Delphi 7 27.01.2014 18:39
Скриншот рабочего стола C# alxd Общие вопросы .NET 5 08.02.2010 19:38
скриншот рабочего стола, с обновлением leonw Общие вопросы Delphi 2 15.01.2010 04:10