Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++ Builder
Войти
Регистрация
Восстановить пароль
 
Siogun
0 / 0 / 0
Регистрация: 20.11.2014
Сообщений: 30
#1

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

02.12.2014, 13:52. Просмотров 1045. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.12.2014, 13:52
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Захват изображения со второго монитора (C++ Builder):

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

Использование второго монитора в C++ Builder
Подскажите каким образом осуществляется работа в C++Builder со вторым...

Отрисовка изображения поверх канвы (изображения) и вращение изображения
Здравствуйте. Столкнулся с 2умя проблемами при работе с изображениями...

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

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

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

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

Но как то это неправильно
0
demmax2004
116 / 138 / 46
Регистрация: 31.10.2014
Сообщений: 721
Записей в блоге: 1
02.12.2014, 16:20 #4
копируй рабочую область только со второго монитора
0
Siogun
0 / 0 / 0
Регистрация: 20.11.2014
Сообщений: 30
02.12.2014, 17:18  [ТС] #5
А как узнать эту рабочую область? Монитор же может быть разных разрешений и в разных местах расположен, в том числе и в отрицательных координатах.
Нашел статью по похожей теме http://www.codeproject.com/Articles/...s-Using-WinAPI, но не смог разобраться как там все сделали.
0
demmax2004
116 / 138 / 46
Регистрация: 31.10.2014
Сообщений: 721
Записей в блоге: 1
02.12.2014, 17:25 #6
у тебя же выше все координаты есть
0
Убежденный
Ушел с форума
Эксперт С++
15941 / 7252 / 1176
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 1
02.12.2014, 17:50 #7
EnumDisplayMonitors, в ней отфильтровываешь все ненужные устройства
(например, не подключенные или mirror-дисплеи) и получаешь набор
координат и разрешений для каждого монитора.

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

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

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

Как узнать начало координат второго монитора и его размер?
0
Убежденный
Ушел с форума
Эксперт С++
15941 / 7252 / 1176
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 1
02.12.2014, 17:55 #9
Еще вариант получить все нужные координаты и размеры - EnumDisplayDevices/EnumDisplaySettingsEx.
0
Siogun
0 / 0 / 0
Регистрация: 20.11.2014
Сообщений: 30
02.12.2014, 17:59  [ТС] #10
Убежденный, Если не сложно, приведите пример использования EnumDisplayMonitors в моей задаче. Никак не могу понять как ей пользоваться
0
demmax2004
116 / 138 / 46
Регистрация: 31.10.2014
Сообщений: 721
Записей в блоге: 1
02.12.2014, 18:39 #11
Цитата Сообщение от 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
Убежденный
Ушел с форума
Эксперт С++
15941 / 7252 / 1176
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 1
02.12.2014, 18:42 #12
Цитата Сообщение от 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
demmax2004
116 / 138 / 46
Регистрация: 31.10.2014
Сообщений: 721
Записей в блоге: 1
02.12.2014, 18:49 #13
Я же рекомендую EnumDisplayMonitors()
0
Убежденный
Ушел с форума
Эксперт С++
15941 / 7252 / 1176
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 1
02.12.2014, 18:56 #14
Дело в том, что на системах до Windows Vista в набор устройств,
который выдается функцией EnumDisplayMonitors, включаются
mirror-дисплеи, и отфильтровать их там никак нельзя.
0
demmax2004
116 / 138 / 46
Регистрация: 31.10.2014
Сообщений: 721
Записей в блоге: 1
02.12.2014, 19:05 #15
я пока что не встречал чтобы у кого то были mirror-дисплеи
0
Убежденный
Ушел с форума
Эксперт С++
15941 / 7252 / 1176
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 1
02.12.2014, 19:11 #16
Mirror-дисплей - здесь подразумевается виртуальное дисплейное устройство,
такие устройства могут быть в системе при установленных TightVNC, например
(с драйвером DFMirage).
0
demmax2004
116 / 138 / 46
Регистрация: 31.10.2014
Сообщений: 721
Записей в блоге: 1
02.12.2014, 19:31 #17
Цитата Сообщение от Убежденный Посмотреть сообщение
TightVNC, например
(с драйвером DFMirage).
NetOp remote control или Radmin, TeamViewer создают виртуальные дисплеи ?
0
Убежденный
Ушел с форума
Эксперт С++
15941 / 7252 / 1176
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 1
02.12.2014, 20:41 #18
Про первые два не в курсе. TeamViewer точно нет.
0
Siogun
0 / 0 / 0
Регистрация: 20.11.2014
Сообщений: 30
03.12.2014, 12:02  [ТС] #19
Убежденный, demmax2004, Огромное спасибо, то что надо было.
0
03.12.2014, 12:02
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.12.2014, 12:02
Привет! Вот еще темы с решениями:

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

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

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

Захват изображения с HDMI
Добрый день! На ноуте есть HDMI выход, нужно что-то типа переходника, чтобы...


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru