Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/18: Рейтинг темы: голосов - 18, средняя оценка - 4.78
1 / 1 / 0
Регистрация: 20.11.2014
Сообщений: 42

Захват изображения со второго монитора

02.12.2014, 13:52. Показов 4058. Ответов 18
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Как захватить изображение со ВТОРОГО монитора в системе?

Код ниже захватывает изображение всегда с первого
C++
1
2
3
4
5
6
7
      hDC = GetDC (0);                                // сделать снимок экрана
      // или же hDC = CreateDC(L"DISPLAY",NULL,NULL,NULL);
      hMemDC = CreateCompatibleDC (hDC);
      hBmp = CreateCompatibleBitmap (hDC, cxScreen, cyScreen);
      hOld = SelectObject (hMemDC, hBmp);
 
      BitBlt (hMemDC, 0, 0, cxScreen, cyScreen, hDC, 0, 0, SRCCOPY);
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
02.12.2014, 13:52
Ответы с готовыми решениями:

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

Низкая скорость захват изображения с монитора
Привет. Есть (точнее уже угасает..) мысль - построить простенький аналог TeamViewer, сам он не подходит т.к. платный, Ammy admin...

Захват видео с экрана монитора
При захвате видео с экрана надо чтоб происходящее на странице (закладке) постоянно перед глазами было, или идет привязка к воспроизводимому...

18
120 / 142 / 46
Регистрация: 31.10.2014
Сообщений: 721
Записей в блоге: 1
02.12.2014, 16:06
откуда у тебя берется cxScreen, cyScreen ?
0
1 / 1 / 0
Регистрация: 20.11.2014
Сообщений: 42
02.12.2014, 16:19  [ТС]
C++
1
2
cxScreen = GetSystemMetrics (SM_CXSCREEN);      //ширина экрана
cyScreen = GetSystemMetrics (SM_CYSCREEN);      //высота экрана
Пока что нашел способ делать так:
берем виртуальный экран
C++
1
2
cxScreen = GetSystemMetrics (SM_CXVIRTUALSCREEN);      //ширина экрана
cyScreen = GetSystemMetrics (SM_CYVIRTUALSCREEN);      //высота экрана
Получаю изображение сразу двух мониторов.
Затем обрабатываю только нужную область.

Но как то это неправильно
0
120 / 142 / 46
Регистрация: 31.10.2014
Сообщений: 721
Записей в блоге: 1
02.12.2014, 16:20
копируй рабочую область только со второго монитора
0
1 / 1 / 0
Регистрация: 20.11.2014
Сообщений: 42
02.12.2014, 17:18  [ТС]
А как узнать эту рабочую область? Монитор же может быть разных разрешений и в разных местах расположен, в том числе и в отрицательных координатах.
Нашел статью по похожей теме http://www.codeproject.com/Art... ing-WinAPI, но не смог разобраться как там все сделали.
0
120 / 142 / 46
Регистрация: 31.10.2014
Сообщений: 721
Записей в блоге: 1
02.12.2014, 17:25
у тебя же выше все координаты есть
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
02.12.2014, 17:50
EnumDisplayMonitors, в ней отфильтровываешь все ненужные устройства
(например, не подключенные или mirror-дисплеи) и получаешь набор
координат и разрешений для каждого монитора.

Добавлено через 41 секунду
Цитата Сообщение от Siogun Посмотреть сообщение
BitBlt (hMemDC, 0, 0, cxScreen, cyScreen, hDC, 0, 0, SRCCOPY);
Здесь не хватает флага CAPTUREBLT.
0
1 / 1 / 0
Регистрация: 20.11.2014
Сообщений: 42
02.12.2014, 17:54  [ТС]
demmax2004, Вот пример захвата, когда второй монитор расположен справа.


GetSystemMetrics (SM_CXSCREEN) дает размер первого монитора
GetSystemMetrics (SM_CXVIRTUALSCREEN) - размер виртуального монитора, но котором расположены реальные в определенных местах.

Причем начало координат первого 0,0. а вот все следующие где угодно.

Как узнать начало координат второго монитора и его размер?
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
02.12.2014, 17:55
Еще вариант получить все нужные координаты и размеры - EnumDisplayDevices/EnumDisplaySettingsEx.
0
1 / 1 / 0
Регистрация: 20.11.2014
Сообщений: 42
02.12.2014, 17:59  [ТС]
Убежденный, Если не сложно, приведите пример использования EnumDisplayMonitors в моей задаче. Никак не могу понять как ей пользоваться
0
120 / 142 / 46
Регистрация: 31.10.2014
Сообщений: 721
Записей в блоге: 1
02.12.2014, 18:39
Цитата Сообщение от Siogun Посмотреть сообщение
Причем начало координат первого 0,0. а вот все следующие где угодно.
Я только один раз встречал у навороченного геймера когда он монитор слева-вниз ставил (из 5 мониторов)
ну если такая ситуация случилась нужно использовать

C++
1
2
3
4
5
6
7
8
9
10
11
EnumDisplayMonitors(NULL, NULL, MonitorEnumProc, NULL);
 
BOOL CALLBACK MonitorEnumProc(HMONITOR hMonitor, HDC hdcMonitor, LPRECT lprcMonitor, LPARAM dwData)
{
    lprcMonitor->left;
    lprcMonitor->right;
    lprcMonitor->top;
    lprcMonitor->bottom;
 
        return TRUE;
}
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
02.12.2014, 18:42
Цитата Сообщение от Siogun Посмотреть сообщение
Если не сложно, приведите пример использования EnumDisplayMonitors в моей задаче.
Я рекомендую пользоваться не EnumDisplayMonitors, а именно EnumDisplayDevices,
так как в ней проще отфильтровать ненужные устройства.

Функция возвращает вектор структур display с координатами и размерами:
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#define FLAG_IS_SET(Value,  Flag) (Value & Flag)
#define FLAG_NOT_SET(Value, Flag) (!(Value & Flag))
 
 
 
struct display
{
    int X;
    int Y;
    unsigned int Width;
    unsigned int Height;
};
 
 
 
typedef std::vector<display> vec_display_t;
 
 
 
vec_display_t
_stdcall
GetDisplayList()
{
    vec_display_t DisplayList;
 
    DISPLAY_DEVICEW Device;
    DEVMODEW        Mode;
    Device.cb   = sizeof (Device);
    Mode.dmSize = sizeof (Mode);
    Mode.dmDriverExtra = 0;
 
    DWORD Index = 0;
 
    while (EnumDisplayDevicesW(
        NULL, // Device.
        Index,
        &Device,
        0 // Flags.
        ))
    {       
        if (
            (FLAG_IS_SET (Device.StateFlags, DISPLAY_DEVICE_ACTIVE)) &&
            (FLAG_NOT_SET(Device.StateFlags, DISPLAY_DEVICE_MIRRORING_DRIVER))
            )
        {
            if (EnumDisplaySettingsExW(
                &Device.DeviceName[0],
                ENUM_CURRENT_SETTINGS,
                &Mode,
                0 // Flags
                ))
            {
                display const Display =
                {
                    Mode.dmPosition.x,
                    Mode.dmPosition.y,
                    Mode.dmPelsWidth,
                    Mode.dmPelsHeight
                };
 
                DisplayList.push_back(Display);
            }
        }
 
        ++Index;
    }
 
    return DisplayList;
}
1
120 / 142 / 46
Регистрация: 31.10.2014
Сообщений: 721
Записей в блоге: 1
02.12.2014, 18:49
Я же рекомендую EnumDisplayMonitors()
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
02.12.2014, 18:56
Дело в том, что на системах до Windows Vista в набор устройств,
который выдается функцией EnumDisplayMonitors, включаются
mirror-дисплеи, и отфильтровать их там никак нельзя.
0
120 / 142 / 46
Регистрация: 31.10.2014
Сообщений: 721
Записей в блоге: 1
02.12.2014, 19:05
я пока что не встречал чтобы у кого то были mirror-дисплеи
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
02.12.2014, 19:11
Mirror-дисплей - здесь подразумевается виртуальное дисплейное устройство,
такие устройства могут быть в системе при установленных TightVNC, например
(с драйвером DFMirage).
0
120 / 142 / 46
Регистрация: 31.10.2014
Сообщений: 721
Записей в блоге: 1
02.12.2014, 19:31
Цитата Сообщение от Убежденный Посмотреть сообщение
TightVNC, например
(с драйвером DFMirage).
NetOp remote control или Radmin, TeamViewer создают виртуальные дисплеи ?
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
02.12.2014, 20:41
Про первые два не в курсе. TeamViewer точно нет.
0
1 / 1 / 0
Регистрация: 20.11.2014
Сообщений: 42
03.12.2014, 12:02  [ТС]
Убежденный, demmax2004, Огромное спасибо, то что надо было.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
03.12.2014, 12:02
Помогаю со студенческими работами здесь

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

Захват изображения
Нужен софт для захвата изображения. Случай такой: захожу на один сайт с помощью браузера, там есть изображение, на странице сайта есть...

Захват изображения с камеры
Есть некая камера со своим SDK. Пишу простенькое приложение для захвата с неё изображения. Ниже пробный код, который по нажатию кнопки...

TvideoGrabber, захват изображения
возникла проблема при захвате изображения с вэбкамеры через Граббер. Граблю пикчу через файл, а потом ее читаю в Imgview32, но почемуто...

Захват изображения с вебкамеры
Уважаемые программисты:). Пожалуйста, помогите разобраться с проблемой.:cry: Я сам новичок в этом деле... Программирую в визуальной среде...


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это дополнительная запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru