|
1 / 1 / 0
Регистрация: 23.02.2017
Сообщений: 17
|
||||||
Скриншот, printscreen05.03.2017, 23:11. Показов 12933. Ответов 48
Метки нет (Все метки)
Доброго времени суток уважаемые форумчане.
В общем стоит задача сделать скриншот экрана, поскольку я с программированием на этапе знакомства решил попробовать написать программу которая сделает скриншот, потом будет обрезать участки этого изображения и сравнивать с шаблонами (что-то типа разгадки несложной капчи ). Я еще не понимаю как эти шаблоны создавать но одно мне стало ясно: в первую очередь нужно сделать скриншот и сохранить его на компьютер. Так вот гуляя по просторам интернета я несколько дней читал как это воплотить в реальность, этот самый скриншот. Было много примеров кода. И тут я наткнулся на тему на этом же форуме где светила программирования решали эту же задачу в далеком 2013 году. Мои логические выводы приняли решение использовать этот код:
Работаю на Dev-C++ Благодарен за любую помощь о добрые люди
0
|
||||||
| 05.03.2017, 23:11 | |
|
Ответы с готовыми решениями:
48
Скриншот с GDI+ Не выводится скриншот на просмотр Скриншот экрана и его вывод |
|
284 / 232 / 114
Регистрация: 07.09.2016
Сообщений: 584
|
||||||
| 05.03.2017, 23:35 | ||||||
Сообщение было отмечено Boyard1 как решение
Решение
похоже вы совсем не шарите, ибо делается все проще некуда. см в конец кода:
2
|
||||||
|
Джоуи
|
|||||||||
| 05.03.2017, 23:39 | |||||||||
|
Вообще, скриншот - довольно популярная тема (у меня самого за плечами программа по трем разным типам скриншотов). Если очень надо, вот код с main (из этой темы Скриншот Кликните здесь для просмотра всего текста
Хотелось бы дать совет
1
|
|||||||||
|
1 / 1 / 0
Регистрация: 23.02.2017
Сообщений: 17
|
|
| 05.03.2017, 23:44 [ТС] | |
|
0
|
|
|
284 / 232 / 114
Регистрация: 07.09.2016
Сообщений: 584
|
||
| 05.03.2017, 23:48 | ||
|
алгоритм такой:
смотрите для на какую функцию undefinde reference например BitBlt вбиваете в гугле. попадаете на мсдн: https://msdn.microsoft.com/ru-... s.85).aspx в конце описания табличка:
Library Gdi32.lib надо залинковать библиотеку к проекту. пробуете запустить. повторяете до тех пор, пока ошибки не закончатся. как это делать в Dev++ хз.
2
|
||
|
1 / 1 / 0
Регистрация: 23.02.2017
Сообщений: 17
|
|
| 05.03.2017, 23:50 [ТС] | |
|
Joey, не работает, может у меня библиотеки какой-то нет?
0
|
|
|
1 / 1 / 0
Регистрация: 23.02.2017
Сообщений: 17
|
|
| 05.03.2017, 23:51 [ТС] | |
|
Понял спасибо, пошел пробовать...
![]() Ххххх - интрижка
0
|
|
|
284 / 232 / 114
Регистрация: 07.09.2016
Сообщений: 584
|
|
| 06.03.2017, 00:05 | |
|
если вы из-за любой ошибки будете приходить на форум - далеко не уедете. там же написано, что существующие функции принимают три аргумента, а вы в вызове два передали. нужен третий. что это за третий аргумент - смотрите по коду, ну или nullptr попробуйте. может прокатит.
0
|
|
|
1 / 1 / 0
Регистрация: 23.02.2017
Сообщений: 17
|
|||||||||||
| 07.03.2017, 14:47 [ТС] | |||||||||||
|
Доброго времени суток.
в первую очередь решил сменить ide удалил Dev-C++ установил visual studio 2015 но версия оказалась не рабочая, потребовала лицензию, я думал она бесплатная. Но при запуске она мне выдавала сообщение что ваш срок истек, и ничего кроме закрытия нельзя было сделать. Ну что-ж мы не сдаемся... а время идет ![]() Решил удалить visual studio и поставить или eclipse или code blocks. Стандартными средствами виндовс через панель управления ее небыло возможно удалить. Мы не сдаемся... а время идет. Зашел в ccleaner и при попытке удалить студию комп просто потух во время удаления. мы не сдавались до последнего. пришлось переустановить windows. Время продолжало беспощадно бежать в бездну. Поставил code blocks. Решил запустить код с второго поста вот этот:
программа выполняется, но файл не сохраняет на комп. Экспериментировал с директориями, ничего не получается вот в этой строке пытался изменить директорию, больше ничего не трогал:
Время продолжает утекать как песок сквозь пальцы. Заранее спасибо за любую помощь.
1
|
|||||||||||
|
1 / 1 / 0
Регистрация: 23.02.2017
Сообщений: 17
|
|
| 07.03.2017, 14:57 [ТС] | |
|
Методом экспериментирования добился успеха. оказалось нужно было еще один слеш поставить.
D:\\screen.bmp
0
|
|
|
-41 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,915
|
||||||
| 05.05.2020, 23:32 | ||||||
|
Здравствуйте,
Тоже понадобилось сделать "сриншот" рабочего стола, но не для сохранения, а для точного поиска в нем какого то статического рисунка, ну для примера "мой компьютер". Нагуглил в том числе и в данном теме этот код, пока что не очень понимаю как он работает:
1)Что в итоге произошло по выполнению этого кода ? Отдельные описания функций я прочитал на MSDNе - но общая картина ка кто не складывается. 2)Как мне получится доступ как бы к массиву данных скриншота ? Чтобы просто попиксельное сравнение с заданным "рисунком" сравнить ?
0
|
||||||
|
|
||||||
| 06.05.2020, 00:04 | ||||||
|
Этим кодом скорее всего будет плохо. Есть два типа битмапов:
DDB и DIB.CreateCompatibleBitmap() создаёт DDB. Из такого можно получить пиксели только копированием через GetBitmapBits() или GetDIBits(). Лишнее копирование это как правило плохо.Думаю в современном коде лучше создавать DIB - при помощи CreateDIBSection().Добавлено через 3 минуты При снятии скриншота обычно получается 24-битное изображение. Но возможно что вам требуется 32-битное. Как управлять форматом при использовании CreateCompatibleBitmap() не смог найти, возможно что никак.А вот для CreateDIBSection() всё указывается явно и строго соблюдается.Добавлено через 2 минуты Для работы на версиях Windows между 2000 и Vista помимо SRCCOPY нужен флаг CAPTUREBLT:
Не уверен правда как лучше - просто во всех версиях фигачить с CAPTUREBLT или всё же приделывать проверку версии ОС...
1
|
||||||
|
-41 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,915
|
||||||
| 06.05.2020, 14:31 | ||||||
|
Не совсем понимаю, что ожидать от функции CreateDIBSection:
0
|
||||||
|
|
||||||||||||||||||||||||||||||||
| 07.05.2020, 01:13 | ||||||||||||||||||||||||||||||||
|
Ну первое что я нашёл - у вас опечатка, вы не в то поле пишете размер структуры. В итоге в нужном поле у вас скорее всего неопределённый мусор.
Ловчее и надёжнее сперва обнулить всю переменную-структуру так:
GetLastError() в справке по функции CreateDIBSection() не говорится (по крайней мере на данный момент):
HBITMAP_DIBSection на NULL (проверку my_char_DIB наверное можно опустить). Кстати почему my_char_DIB?Можем проверять и на ERROR_INVALID_PARAMETER, чтоб уж всё наверняка.Указатель на буфер объявляют обычно как-то так:
Когда изображение biBitCount == 32 пиксели аккурат RGBQUAD. У него там и поля удобные. И по идее как к массиву можно обращаться.
1
|
||||||||||||||||||||||||||||||||
|
-41 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,915
|
||||||||||||||||||
| 07.05.2020, 11:55 | ||||||||||||||||||
Пытаюсь обратится по указателю:
То есть для доступа к массиву этой битовой карты - my_DIB_data нужно разыменовывать и привести к char, чтобы можно было по байтового обращаться к памяти:
0
|
||||||||||||||||||
|
|
|||||||
| 07.05.2020, 15:26 | |||||||
|
Почему cout? У вас консольное что ли? Что вы хотите этим способом увидеть? Это уже указатель, зачем второй раз звёздочку?Кстати, если смотреть что там находится сразу после CreateDIBSection() - то там скорее всего зачищено, одни нули.
1
|
|||||||
|
-41 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,915
|
||||||||||||||
| 07.05.2020, 16:14 | ||||||||||||||
|
Я хотел увидеть значение которое, как понял должно быть в этом массиве. Значение пикселей. Так как я указывал 32 бита, то, как я понял один пиксель этого скриншота будет занимать 4 байта. Я только немного не правильно выводил занчение, нужно было конечно привести к (int). Но даже, если обращаться сразу, как к указателю:
0
|
||||||||||||||
|
|
|||||||
| 07.05.2020, 17:14 | |||||||
|
Мы объявляем указатель. Сами выбирая какого типа.
Можем объявить или указатель на VOID или указатель на unsigned char или указатель на int или указатель на RGBQUAD - как захотим.А в функцию CreateDIBSection() надо передать указатель на наш указатель. Просто чтоб функция могла изменить значение нашего указателя. ![]() Если у вас указатель на простой тип вроде unsigned char или int, то не надо ни к чему приводить.Вы только что создали новый битмап. Что же в нём должно быть по-вашему? Радуга? Картина Ван-Гога? ![]() Вам выделили память, чтоб там не было случайного мусора - обнулили её. Теперь у вас битмап залитый цветом (0, 0, 0, 0). Нарисуйте на нём что-нибудь - тогда и будут не нули. Добавлено через 22 минуты а... Вы ж в #11 пытались сделать скриншот... Посмотрим...
![]()
1
|
|||||||
|
-41 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,915
|
|||||||||||||||||
| 07.05.2020, 18:12 | |||||||||||||||||
А второй параметр функции SelectObject:
То есть SelectObject нарисует в битовой карте рисунок, который как бы есть в CreateCompatibleDC ? Добавлено через 48 минут Не
0
|
|||||||||||||||||
|
|
||||||
| 07.05.2020, 18:31 | ||||||
|
Для рисования на битмапе есть варианты:
Был ещё вроде какой-то метод с HBITMAP, но там игнорируется альфа-канал, да и вообще вроде бы копируется, а не используется переданный. хм... А может когда с BITMAPINFO тоже копируется? Это я лучше ещё уточню... Для рисования через GDI32 да, придётся создать HDC и выбрать битмап в него, так как все функции GDI32 работают через HDC:
SelectObject() не рисует, а "соединяет" HDC с HGDIOBJ - например с HBITMAP.Добавлено через 41 секунду BitBlt() - копирует с HDC на HDC в масштабе 1-к-1.
1
|
||||||
| 07.05.2020, 18:31 | |
|
Помогаю со студенческими работами здесь
20
Скриншот с окна Internet Explorer 8 Сделать скриншот средствами WinAPI Получить скриншот посредством GetDC
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes.
А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения
развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
|
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ *
Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам
Кирхгофа, решает её и находит токи на L и напряжения на C в установ. режимах до и. . .
|
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым.
Но восстановить их можно так.
Для этого понадобится консольная утилита. . .
|
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
|
|
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
|
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11
— это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
|
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11
Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
|
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
|