С Новым годом! Форум программистов, компьютерный форум, киберфорум
C++: OpenCV
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.76/21: Рейтинг темы: голосов - 21, средняя оценка - 4.76
2 / 2 / 0
Регистрация: 29.05.2024
Сообщений: 30
1

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

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

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

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

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

Посоветуйте, пожалуйста, кто сталкивался с такой задачей.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.06.2024, 10:24
Ответы с готовыми решениями:

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

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

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

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

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

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

Опять же, получить само окно приложения можно и с помощью WinAPI, и потом уже его скриншотить используя методы OpenCV
0
2 / 2 / 0
Регистрация: 29.05.2024
Сообщений: 30
28.06.2024, 13:14  [ТС] 5
Цитата Сообщение от andreyfreelans Посмотреть сообщение
получить само окно приложения можно и с помощью WinAPI
Спасибо. Можете дать совет где прочитать про это? Гугл выдаёт примерно миллион ссылок и первые сто тысяч ведут куда-то не туда.
0
542 / 332 / 169
Регистрация: 21.02.2011
Сообщений: 5,008
28.06.2024, 13:20 6
вот, поиграйтесь,
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
Сообщений: 30
28.06.2024, 13:40  [ТС] 7
Цитата Сообщение от andreyfreelans Посмотреть сообщение
вот, поиграйтесь,
Спасибо. Буду играться.
1
2 / 2 / 0
Регистрация: 29.05.2024
Сообщений: 30
29.06.2024, 15:32  [ТС] 8
Цитата Сообщение от andreyfreelans Посмотреть сообщение
&bi
Поигрался. Докладываю.

Во-первых, спасибо, что объяснили в какую сторону вообще надо копать.
Во-вторых, как я понял, ваш ответ был вдохновлён вот этим примером: https://superkogito.github.io/... pencv.html , поэтому исправить ошибку в коде не составило труда. Переменная "bi" не определена в вашем ответе, но я её определил, используя пример из ссылки.
В-третьих, могу сказать, что код у меня так и не заработал правильно - возвращаются просто тёмные изображения. Возможно я не верное определил "bi".
В-четвёртых, то, что код не работает как надо, это не страшно, т.к. всё равно понятно, что читать, куда смотреть и в каком направлении двигаться в целом.
Спасибо, ещё раз и удачи нам всем.
1
542 / 332 / 169
Регистрация: 21.02.2011
Сообщений: 5,008
02.07.2024, 11:10 9
я и не писал, что скопировав мой код и вставив в свою программу у вас сразу же все заработает.
судя по вашим ответом - вы поняли суть и разобрались, мой посыл был именно в этом.
1
02.07.2024, 11:10
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.07.2024, 11:10
Помогаю со студенческими работами здесь

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

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

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

Как узнать ID запущенного приложения
Здраствуйте. Есть скрипт который запускает приложение и показывает его ID. А как вывести ID уже...

Настройки приложения запущенного на Tomcat
Деплою на Tomcat war-файл из IDEA. Приложение запускается и работает, но почему-то не подхватывает...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru