|
1 / 1 / 0
Регистрация: 23.02.2017
Сообщений: 17
|
||||||
Скриншот, printscreen05.03.2017, 23:11. Показов 13143. Ответов 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
|
||||||||||||||||||
|
фрилансер
6479 / 5701 / 1132
Регистрация: 11.10.2019
Сообщений: 15,183
|
||
| 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
|
|||||||
|
фрилансер
6479 / 5701 / 1132
Регистрация: 11.10.2019
Сообщений: 15,183
|
|||
| 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
|
||
|
фрилансер
6479 / 5701 / 1132
Регистрация: 11.10.2019
Сообщений: 15,183
|
||||||
| 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
|
|
|
фрилансер
6479 / 5701 / 1132
Регистрация: 11.10.2019
Сообщений: 15,183
|
||
| 03.06.2020, 19:10 | ||
|
1
|
||
|
-41 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,915
|
||
| 03.06.2020, 19:29 | ||
|
То есть мне этот массив нужно будет уже освобождать из main`а получается.
0
|
||
|
фрилансер
6479 / 5701 / 1132
Регистрация: 11.10.2019
Сообщений: 15,183
|
|
| 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
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
| Опции темы | |
|
|
Новые блоги и статьи
|
|||
|
Благородство как наказание
Maks 24.04.2026
У хорошего человека отношения с женщинами всегда складываются трудно. А я человек хороший. Заявляю без тени смущения, потому что гордиться тут нечем. От хорошего человека ждут соответствующего. . .
|
Валидация и контроль данных табличной части документа перед записью
Maks 22.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в КА2.
Задача: контроль и валидация данных табличной части документа перед записью с учетом регламента компании. . .
|
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2.
Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом.
В. . .
|
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2.
Задача: отобразить спецтехнику, которая на данный момент находится в ремонте.
Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
|
|
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
|
Запрет удаления строк ТЧ документа при определённом условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
|
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут
Суть:
- Группа наркоманов из 10 человек.
- Только один инфицирован ВИЧ.
- Колются одной иглой.
- Колются раз в день.
- Колются последовательно через. . .
|
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
|