|
1 / 1 / 0
Регистрация: 23.02.2017
Сообщений: 17
|
||||||
Скриншот, printscreen05.03.2017, 23:11. Показов 13025. Ответов 48
Метки нет (Все метки)
Доброго времени суток уважаемые форумчане.
В общем стоит задача сделать скриншот экрана, поскольку я с программированием на этапе знакомства решил попробовать написать программу которая сделает скриншот, потом будет обрезать участки этого изображения и сравнивать с шаблонами (что-то типа разгадки несложной капчи ). Я еще не понимаю как эти шаблоны создавать но одно мне стало ясно: в первую очередь нужно сделать скриншот и сохранить его на компьютер. Так вот гуляя по просторам интернета я несколько дней читал как это воплотить в реальность, этот самый скриншот. Было много примеров кода. И тут я наткнулся на тему на этом же форуме где светила программирования решали эту же задачу в далеком 2013 году. Мои логические выводы приняли решение использовать этот код:
Работаю на Dev-C++ Благодарен за любую помощь о добрые люди
0
|
||||||
| 05.03.2017, 23:11 | |
|
Ответы с готовыми решениями:
48
Скриншот с GDI+ Не выводится скриншот на просмотр Скриншот экрана и его вывод |
|
-41 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,915
|
||
| 07.05.2020, 19:28 | ||
|
Какая функция в итоге заполняет DB-буфер по указателю ? Bitbit ? Или все гораздо сложнее ? Добавлено через 39 минут Я тогда вообще не понимаю, если функция CreateDIBSection - создает по сути буфер в соответствии с заполненными параметрами из структуры BITMAPINFO, зачем первый аргументом в эту функцию нужно передавать дескриптор контекста устройства, что функция с ним делает.
0
|
||
|
|
||
| 07.05.2020, 20:42 | ||
|
Это надо читать про основы Windows GDI
Windows GDI (или GDI32) работает только через понятие "Device Context". Переменные типа HDC служат для хранения описателя (хэндла) конкретного "Device Context".
Само значение переменной HDC никому не ведомо и может быть как индексом какого-то внутреннего массива чего-то, так каким-то внутренним указателем на что-то. Что именно это такое и как устроено внутри кода операционной системы - никто не скажет, типа коммерческая тайна. Считается "чёрный ящиком". Прикладные программы могут лишь получать и использовать значения HDC, выданные операционной системой. "Device Context" (HDC) имеет "текущие HGDIOBJ объекты" - каждого из типов по одному: Битмап, Палитра, Перо (ручка/контуры), Кисть (заполнение/заливка), Шрифт, Регион и Фигура (набор Форм). Про них говорят "выбрано в HDC".
При создании нового HDC в него будут выбраны все обязательные объекты как объекты по умолчанию ("стоковые" объекты). Например Битмап будет монохромным (однобитным) и размерами 1x1. Функция SelectObject() меняет текущий объект на тот что мы попросили, при этом возвращая старый (заменённый) текущий объект.Считается за правило после окончания рисования возвращать старые объект обратно как было. Чтоб никто из использующих HDC не вредил друг-другу. При помощи SelectObject() устанавливаем связь между HBITMAP и HDC.Функция BitBlt() копирует заданный участок изображения с одного HDC на заданный участок другого HDC. Даже если в них нет никаких битмапов (например контролы в окнах). Если же в HDC назначения (куда копируется) будет выбран битмап - данные изображения скопируются и в него тоже. Добавлено через 3 минуты Всё такое надо просто смотреть в справке. Там либо объясняется, либо будет просто "делайте так-то и всё тут". https://docs.microsoft.com/en-... dibsection
usage написали iUsage... Если третий параметр указан как DIB_PAL_COLORS, то оно будет брать оттуда палитру...Добавлено через 11 минут Так что по-идее оно в данном случае не нужно, но в справке нет пояснений можно ли передавать NULL, поэтому нам проще передавать, тем более что оно у нас и так уже есть.
1
|
||
|
-41 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,915
|
||||||||||||||||||
| 27.05.2020, 20:47 | ||||||||||||||||||
Не могу понять, что происходит, когда указатель приводится к void**. Просто ради понимания я пытался передавать в функцию просто объявленный указатель на указатель на void:
То есть чтобы вывести адрес указателя void:
Я не понимаю, как мне в явном виде пережать параметр в функцию и какой тогда должен быть этот параметр.
0
|
||||||||||||||||||
|
фрилансер
6455 / 5657 / 1129
Регистрация: 11.10.2019
Сообщений: 15,070
|
||
| 27.05.2020, 21:26 | ||
|
Добавлено через 2 минуты void* my_char_DIB_p_p = 0; HBITMAP HBITMAP_DIBSection = CreateDIBSection(HDC_CreateCompatibleDC, &My_struct_BITMAPINFO, DIB_RGB_COLORS, &my_char_DIB_p_p , NULL, NULL);
1
|
||
|
-41 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,915
|
|||||||
| 27.05.2020, 21:53 | |||||||
|
После Вашего ответа понял, что я не так делал:
, соответственно функция и не смогла поместить в ноль -- > адрес на буфер данных.Странно только, что функция ошибку не выдала, видимо для нее - это не ошибка.
0
|
|||||||
|
фрилансер
6455 / 5657 / 1129
Регистрация: 11.10.2019
Сообщений: 15,070
|
|||
| 27.05.2020, 22:08 | |||
|
1
|
|||
|
|
||||
| 27.05.2020, 23:32 | ||||
Можно конечно было выделить память вручную, но удобнее же просто объявить переменную типа "указатель" и передавать указатель на неё.
Добавлено через 1 минуту Её же можно получить в любой момент позднее.
1
|
||||
|
-41 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,915
|
|
| 01.06.2020, 19:49 | |
|
Немного не по теме: а как Windows делает скриншот рабочего стола из двух мониторов с разной настройкой битности ?
Ну то есть, грубо говоря, я просто нажал кнопку принтскреен, windows в буфер поместила массив с пикселями, причем часть массива описывает к примеру пиксель 16-битный, вторая часть массива 32-битный. Предположим далее я вставляя их в paint и сохраняю, ка файл bmp 32-разрядный. Но часть то массива описывает пиксель 16-ю битами. Получается при сохранении эти 16 бит преобразовываются в 32-разрядный массив и таким образом сохраняются ?
0
|
|
|
|
|
| 02.06.2020, 02:03 | |
|
хм... Вроде бы как у всех мониторов один общий HDC. По крайней мере раньше всегда было так.
Разные области одного и того же массива не могут быть разного типа. Наверняка HDC будет максимальной битности. И просто некоторые мониторы могут быть аппаратно в другом режиме... А вот какой сигнал они получают по проводу от видеокарты - фиг знает... Добавлено через 1 минуту Где-то между "итоговым битмапом всего рабочего стола" и "конечными пикселями мониторов" оно как-то конвертится... Добавлено через 1 минуту А вообще редко у кого много мониторов. Я вот даже потестить не смогу никак. Ещё поискать надо, где одолжить у кого лишний... Добавлено через 7 минут Где-то же в ОС производится разделение по мониторам? Вероятно уже там и подстраивают.
1
|
|
|
-41 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,915
|
|||||||||||
| 03.06.2020, 17:19 | |||||||||||
|
Я сдаюсь:
Я не понимаю почему ? chars - содержит в себе значение адреса который указывает на память выделенную через CreateDIBSection, я просто хочу теперь освободить эту память. В чем же ошибка то ?
0
|
|||||||||||
|
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
|
||
| 03.06.2020, 19:03 | ||
|
Всё что вы можете удалить, это delete my_char_DIB_p_p;Хотя не понятно зачем вообще выделять память под один указатель в куче.
1
|
||
|
фрилансер
6455 / 5657 / 1129
Регистрация: 11.10.2019
Сообщений: 15,070
|
||||||
| 03.06.2020, 19:06 | ||||||
|
Optimus11,
char* chars - переменная, которая указывает на тип char . А my_char_DIB_p_p указывает на тип void*. Ты насильно приводишь указатель одного типа к другому и пытаешься там память освободить, при этом ещё и указывая []зачем ты всё это делаешь? Вот без всякой магии:
никакого delete не надо, удаление производится вызовом DeleteObject для хендла HBITMAP
1
|
||||||
|
-41 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,915
|
||
| 03.06.2020, 19:07 | ||
|
[QUOTE=zayats80888;14615993]В том, что вы пытаетесь "удалить" то, что не "создавали".
Всё что вы можете удалить, это delete my_char_DIB_p_p;А как тогда можно освободить эту память? Или этого нельзя принципе ?
0
|
||
| 03.06.2020, 19:09 | |
|
0
|
|
|
фрилансер
6455 / 5657 / 1129
Регистрация: 11.10.2019
Сообщений: 15,070
|
||
| 03.06.2020, 19:10 | ||
|
1
|
||
|
-41 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,915
|
||
| 03.06.2020, 19:29 | ||
|
То есть мне этот массив нужно будет уже освобождать из main`а получается.
0
|
||
|
фрилансер
6455 / 5657 / 1129
Регистрация: 11.10.2019
Сообщений: 15,070
|
|
| 03.06.2020, 19:40 | |
|
Optimus11, достаточно помнить только хендл HBITMAP. При помощи хендла можно и работать с этим битмапом и удалить его
Добавлено через 4 минуты Optimus11, аналогии из того же WinAPI: HWND - хендл окна. Через него производится вся работа с окном HDC - хендл контекста устройства для каждого типа хендла свой набор WinAPI-функций
1
|
|
|
-41 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,915
|
|
| 03.06.2020, 19:54 | |
|
Спасибо!
0
|
|
|
|
||
| 03.06.2020, 20:23 | ||
|
Дак напишите класс, который будет хранить и TDIBSection и HBITMAP и Scan0 и возможно даже HDC (ну или метод чтоб получать его).
Добавлено через 1 минуту DeleteObject() для HBITMAP.И оно "помечает" на освобождение, не гарантируется что непосредственно само освобождение будет моментально.
1
|
||
|
-41 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,915
|
||||||||||||
| 11.06.2020, 20:14 | ||||||||||||
|
Без подсказки не разобраться
![]() Снятие скриншота экрана прексрано работает, но в сегодня вдруг мне подумалось просто протестириовать взятие скриншотоа в цикле на 10 тыщ раз, так на всякий случай и вот видимо не зря, потому что то на некотором элементе цикла вылазет ошибка:
0
|
||||||||||||
| 11.06.2020, 20:14 | |
|
Помогаю со студенческими работами здесь
40
Скриншот с окна Internet Explorer 8 Сделать скриншот средствами WinAPI Получить скриншот посредством GetDC
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога
Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
|
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование
. \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json>
Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом.
# Check if. . .
|
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так:
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347
Основана на STM32F303RBT6.
На борту пять. . .
|
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
|
|
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу,
и светлой Луне.
В мире
покоя нет
и люди
не могут жить в тишине.
А жить им немного лет.
|
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила»
«Время-Деньги»
«Деньги -Пуля»
|
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога
Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
|