Форум программистов, компьютерный форум, киберфорум
C++: OpenCV
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/25: Рейтинг темы: голосов - 25, средняя оценка - 4.88
2 / 2 / 0
Регистрация: 29.05.2024
Сообщений: 35

Скриншот запущенного приложения

27.06.2024, 10:24. Показов 6950. Ответов 8

Author24 — интернет-сервис помощи студентам
У меня есть два приложения, запущенных в каком-то режиме, оконном или полноэкранном.

Вопрос, могу ли я сделать скриншот любого из этих приложений, не раскрывая их во весь экран? Т.е. внутри программки, которую я пишу и с которой я работаю, я нажимаю кнопку "1" и у меня где-то сохраняется текущий скрин приложения 1, без разворачивания приложения на весь экран. В той же моей программке я нажимаю кнопку "2" и у меня где-то сохраняется текущий скрин второго приложения, также без разворачивания его на экран. И вот я сижу и балуюсь, нажимаю эти кнопочки, а у меня где-то сохраняются скрины приложений.

Интересен конечно самый быстрый способ, возможно это будет работать через openCV, возможно через winApi или что-то ещё.

Посоветуйте, пожалуйста, кто сталкивался с такой задачей.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
27.06.2024, 10:24
Ответы с готовыми решениями:

Запрет на запуск других экземпляров запущенного приложения
здравствуйте Как заставить мое приложение, чтобы открыть только один ехе? ну например когда я запускаю Project.exe втарой раз не...

Как сделать скриншот полноэкранного приложения?
Всем доброго времени суток. Недавно начал разбираться с opencv и появилась проблема: я делаю скриншот по Handel игры, при помощи getDC...

Скриншот экрана(именно самого приложения) возможно такое ?
Доброго времени суток, господа! Интересно, был ли у кого опыт проворачивания такой затеи? Нет проблемы в создании скриншота экрана, а как...

8
 Аватар для andrey_f
596 / 379 / 184
Регистрация: 21.02.2011
Сообщений: 5,130
28.06.2024, 11:43
Цитата Сообщение от Alex_Solo_Mars Посмотреть сообщение
через openCV
примерно так наверное
Code Скопировано
1
2
3
4
Используйте функцию cv2.VideoCapture() для захвата изображения с экрана.
Получаете текущий снимок экрана с помощью функции cv2.VideoCapture.read().
Выделяете область для скриншота приложения, используя координаты и размеры окна приложения.
Сохраняете полученный снимок в файл с помощью функции cv2.imwrite().
0
2 / 2 / 0
Регистрация: 29.05.2024
Сообщений: 35
28.06.2024, 12:25  [ТС]
Цитата Сообщение от andreyfreelans Посмотреть сообщение
Используйте функцию cv2.VideoCapture()
Спасибо, а как VideoCapture() поймёт, экран какого приложение надо захватывать?
0
 Аватар для andrey_f
596 / 379 / 184
Регистрация: 21.02.2011
Сообщений: 5,130
28.06.2024, 13:03
Цитата Сообщение от Alex_Solo_Mars Посмотреть сообщение
Спасибо, а как VideoCapture() поймёт, экран какого приложение надо захватывать?
Почитайте документацию, туда можно передать индекс приложения или его имя.

Опять же, получить само окно приложения можно и с помощью WinAPI, и потом уже его скриншотить используя методы OpenCV
0
2 / 2 / 0
Регистрация: 29.05.2024
Сообщений: 35
28.06.2024, 13:14  [ТС]
Цитата Сообщение от andreyfreelans Посмотреть сообщение
получить само окно приложения можно и с помощью WinAPI
Спасибо. Можете дать совет где прочитать про это? Гугл выдаёт примерно миллион ссылок и первые сто тысяч ведут куда-то не туда.
0
 Аватар для andrey_f
596 / 379 / 184
Регистрация: 21.02.2011
Сообщений: 5,130
28.06.2024, 13:20
вот, поиграйтесь,
C++ Скопировано
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
HWND hWnd1 = FindWindow(NULL, "Название приложения 1");
HWND hWnd2 = FindWindow(NULL, "Название приложения 2");
 
if(hWnd1 && hWnd2) {
    // Получаем скриншоты окон
    cv::Mat screenshot1, screenshot2;
    screenshot1 = getScreenshot(hWnd1);
    screenshot2 = getScreenshot(hWnd2);
 
    // Сохраняем скриншоты
    cv::imwrite("screenshot1.jpg", screenshot1);
    cv::imwrite("screenshot2.jpg", screenshot2);
}
 
cv::Mat getScreenshot(HWND hWnd) {
    // Получаем размеры окна
    RECT windowRect;
    GetWindowRect(hWnd, &windowRect);
 
    int width = windowRect.right - windowRect.left;
    int height = windowRect.bottom - windowRect.top;
 
    // Создаем матрицу для скриншота
    cv::Mat screenshot(height, width, CV_8UC3);
 
    // Копируем содержимое окна в матрицу
    HDC hWindowDC = GetDC(hWnd);
    HDC hCaptureDC = CreateCompatibleDC(hWindowDC);
    HBITMAP hCaptureBitmap = CreateCompatibleBitmap(hWindowDC, width, height);
    SelectObject(hCaptureDC, hCaptureBitmap);
    BitBlt(hCaptureDC, 0, 0, width, height, hWindowDC, 0, 0, SRCCOPY);
    GetDIBits(hCaptureDC, hCaptureBitmap, 0, height, screenshot.data, (BITMAPINFO*)&bi, DIB_RGB_COLORS);
 
    // Освобождаем ресурсы
    DeleteObject(hCaptureBitmap);
    DeleteDC(hCaptureDC);
    ReleaseDC(hWnd, hWindowDC);
 
    return screenshot;
}
Добавлено через 1 минуту
Цитата Сообщение от Alex_Solo_Mars Посмотреть сообщение
Спасибо. Можете дать совет где прочитать про это?
лучше официальную документацию смотреть
0
2 / 2 / 0
Регистрация: 29.05.2024
Сообщений: 35
28.06.2024, 13:40  [ТС]
Цитата Сообщение от andreyfreelans Посмотреть сообщение
вот, поиграйтесь,
Спасибо. Буду играться.
1
2 / 2 / 0
Регистрация: 29.05.2024
Сообщений: 35
29.06.2024, 15:32  [ТС]
Цитата Сообщение от andreyfreelans Посмотреть сообщение
&bi
Поигрался. Докладываю.

Во-первых, спасибо, что объяснили в какую сторону вообще надо копать.
Во-вторых, как я понял, ваш ответ был вдохновлён вот этим примером: https://superkogito.github.io/... pencv.html , поэтому исправить ошибку в коде не составило труда. Переменная "bi" не определена в вашем ответе, но я её определил, используя пример из ссылки.
В-третьих, могу сказать, что код у меня так и не заработал правильно - возвращаются просто тёмные изображения. Возможно я не верное определил "bi".
В-четвёртых, то, что код не работает как надо, это не страшно, т.к. всё равно понятно, что читать, куда смотреть и в каком направлении двигаться в целом.
Спасибо, ещё раз и удачи нам всем.
1
 Аватар для andrey_f
596 / 379 / 184
Регистрация: 21.02.2011
Сообщений: 5,130
02.07.2024, 11:10
я и не писал, что скопировав мой код и вставив в свою программу у вас сразу же все заработает.
судя по вашим ответом - вы поняли суть и разобрались, мой посыл был именно в этом.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
02.07.2024, 11:10
Помогаю со студенческими работами здесь

Блокировка запущенного приложения
Здравствуйте. Необходимо написать программу, через которую создаётся ярлык на стороннее приложение. По этому ярлыку запускается...

Проверка запущенного приложения
Как можно проверить запущено ли приложение или нет. Пробовал такой код: Process processList; processList =...

Создание COM объекта из запущенного приложения
Здравствуйте Уважаемые! есть установленная(на сервер) лицензионная программа 1с83 ключ на 5 лицензий подключение и запуск программы на...

Не отрисовываются элементы запущенного приложения
Добрый день. Через приложение udeploy на удаленной машине запускается VBS скрипт, который запускает калькулятор. Все запущенные...

Развертывание уже запущенного приложения
Подскажите, как правильно сделать. При запуске приложение - свернуто в трей, как при повторном запуске не открывать дубликат, а...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Списки и кортежи в Python: различия, особенности, применение
py-thonny 13.04.2025
Python славится своей гибкостью при работе с данными. В арсенале языка есть две основные последовательные структуры данных, которые программисты используют ежедневно — списки и кортежи. Эти структуры. . .
Middleware в ASP.NET Core
UnmanagedCoder 13.04.2025
В ASP. NET Core термин "middleware" занимает особое место. Что же это такое? Middleware представляет собой программные компоненты, которые формируют конвейер обработки HTTP-запросов в приложении. . . .
Таблицы лута в Unity с MinMaxCurve и AnimationCurve
GameUnited 12.04.2025
Создание сбалансированного лута в играх — задача не из простых. Разработчики постоянно ищут способы настройки систем выпадения предметов, которые будут одновременно справедливыми для игроков и. . .
std::expected в C++: Управление ошибками
bytestream 12.04.2025
Обработка ошибок всегда была важной и одновременно сложной задачей в программировании на C++. На протяжении долгого времени разработчики использовали различные подходы: возвращаемые коды ошибок,. . .
Nullable типы и операторы объединения null в C#
UnmanagedCoder 12.04.2025
Многие шутят, что null — это миллиардная ошибка в программировании. И в этой шутке только доля шутки. Тони Хоар, создатель null-ссылки, сам назвал её своей "ошибкой на миллиард долларов". Почему?. . .
Аутентификация и авторизация JWT в микросервисах с API Gateway
stackOverflow 12.04.2025
В традиционных монолитных приложениях безопасность часто реализуется как единый защитный периметр - пользователь проходит аутентификацию один раз, после чего получает доступ ко всем функциям системы. . . .
TypeScript: Интерфейсы vs Типы
run.dev 11.04.2025
Современная разработка на JavaScript сталкивается с множеством проблем при масштабировании проектов. Типизация кода стала хорошим инструментом, помогающим избежать ошибок во время выполнения,. . .
Управление топиками и разделами Kafka
Javaican 11.04.2025
Apache Kafka — распределенная платформа потоковой передачи данных, которая стала стандартом для построения высоконагруженных систем обмена сообщениями. В современной архитектуре микросервисов,. . .
Миграция монолита в Event-Driven микросервисную архитектуру на C#
stackOverflow 11.04.2025
Монолитная архитектура – классический подход к разработке программного обеспечения. Это приложение, построенное как единое целое, где все компоненты тесно связаны между собой. Большинство проектов. . .
Go в Kubernetes: Управление ресурсами
golander 11.04.2025
Разработчики Go-приложений в Kubernetes часто сталкиваются с неожиданными проблемами производительности и даже внезапными отказами контейнеров. Причина этого кроется в особенностях взаимодействия. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru
Выделить код Копировать код Сохранить код Нормальный размер Увеличенный размер