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

Работа с EnumDisplayDevices

08.07.2015, 19:15. Показов 3674. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Все добрый день. На лето задали практику - написать прогу которая получает инфу о компе, с оперативкой, процессором, ОС и с жестким диском я разобрался, но вот с EnumDisplayDevices у меня проблемы. Порылся в гугле, пробовал код, но у меня он какой-то бред выводил. Может кто объяснить нормально/дать нормальный код с данной функцией?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
08.07.2015, 19:15
Ответы с готовыми решениями:

EnumDisplayDevices
что делать если пишит что функция EnumDisplayDevices error C2065: 'EnumDisplayDevices' : undeclared identifier подключил все...

Как правильно вызвать EnumDisplayDevices?
Здравствуйте, подскажите, как мне вызвать правильно EnumDisplayDevices Пробую как в коде, который мне скомпилировала Visual Studio, но...

Работа - проведение обучающих семинаров по C#. Работа по выходным дням ( сб-вс - 32 часа). От 30 000р.
Обязанности - проведение обучающих семинаров по C# Базовый (начальный уровень). Опыт преподавания не обязателен, главное чтобы вы не...

13
117 / 121 / 42
Регистрация: 25.08.2012
Сообщений: 1,294
09.07.2015, 17:25
Лучший ответ Сообщение было отмечено Chrom1996 как решение

Решение

Chrom1996, здесь смотрели? Все довольно просто. Устанавливайте член структуры DISPLAY_DEVICE cb как sizeof(DISPLAY_DEVICE):
C++
1
display_device.cb = sizeof(display_device);
потом запускаете цикл
C++
1
2
for(int i = 0; EnumDisplayDevices(NULL, i, &display_device, 0); ++i)
   // дальше выводите информацию из структуры display_device
Цикл выполнится столько раз, сколько дисплеев имеется на время запуска функции в системе.
1
-41 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,915
19.05.2020, 21:51
Цитата Сообщение от tnk500 Посмотреть сообщение

Цикл выполнится столько раз, сколько дисплеев имеется на время запуска функции в системе.
EnumDisplayDevices - странновато работает:
C++
1
2
Если функция завершается успешно, возвращаемое значение отлично от нуля.
Если функция не работает, возвращаемое значение равно нулю.
C++
1
Цикл выполнится столько раз, сколько дисплеев имеется на время запуска функции в системе
У меня подключен всего один монитор, соответственно дисплеев должно быть ровно 1, но:
C++
1
2
3
4
5
DISPLAY_DEVICE My_diplay_device;
My_diplay_device.cb = sizeof(DISPLAY_DEVICE);
 
int numm = EnumDisplayDevices(NULL, 3, &My_diplay_device, 0);
cout<<numm ;
На значениях второго параметра 0,1,2 - numm возвращается 1, и только когда я указываю индекс 3 - возвращается ноль. То есть получается, что у меня подключено три дисплея ? Но это же не так.
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
19.05.2020, 22:00
Цитата Сообщение от Optimus11 Посмотреть сообщение
На значениях второго параметра 0,1,2 - numm возвращается 1, и только когда я указываю индекс 3 - возвращается ноль. То есть получается, что у меня подключено три дисплея ? Но это же не так.
Это не мониторы, это выходы видеокарты. Посмотри названия - My_diplay_device.DeviceName и My_diplay_device.DeviceString

Добавлено через 1 минуту
Мониторы перечисляются вот так
Дескриптор монитора и GetMonitorInfo
1
-41 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,915
21.05.2020, 11:38
Подскажите пожалуйста в чем ошибка:

C++
1
2
3
4
5
6
7
8
DISPLAY_DEVICEA My_diplay_device;
 
My_diplay_device.cb = sizeof(DISPLAY_DEVICE);
int numm = EnumDisplayDevicesA(NULL, 0, &My_diplay_device, 0);
 
cout <<numm<< endl;  // 1 - то есть функция завершилась успешно
 
cout << sMy_diplay_device.DeviceName<< endl;  //А вот тут вылетает ошибка: status_screen was corrupted
status_screen was corrupted - статус экрана поврежден.
Я очень отдалено могу предположить, что это как то связано с этим:
Операционная система идентифицирует каждое устройство отображения в текущем сеансе с помощью значения индекса. Значения индекса являются последовательными целыми числами, начиная с 0. Если текущий сеанс имеет, например, три устройства отображения, они указываются значениями индекса 0, 1 и 2.
Но даже если это и связано как то с этим "текущем сеансом", то даже не могу предположить как.

Добавлено через 19 минут
Ошибка возникает даже не только при попытке вывода на коносль, а вообще просто по вершению main()
C++
1
2
3
4
5
6
7
8
9
int main()
{
DISPLAY_DEVICEA My_diplay_device;
 
My_diplay_device.cb = sizeof(DISPLAY_DEVICE);
int numm = EnumDisplayDevicesA(NULL, 0, &My_diplay_device, 0);
 
//Ошибок нет
}//и как только все строчки коды выполнились, тут возникает "status_screen was corrupted "
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
21.05.2020, 11:42
Цитата Сообщение от Optimus11 Посмотреть сообщение
Ошибка возникает даже не только при попытке вывода на коносль, а вообще просто по вершению main()
Попробуй установить нормальный размер структуры
C++
1
My_diplay_device.cb = sizeof(My_diplay_device);
1
-41 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,915
21.05.2020, 12:55
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Попробуй установить нормальный размер структуры
C++
1
My_diplay_device.cb = sizeof(My_diplay_device);
Буквально за нескоьлко секунд до Вашего сообщения понял в чем дело, у меня сначала было DISPLAY_DEVICE, но она при поптыке вывести в консоль My_diplay_device.DeviceString - выводила какой то адресс в памяти за место имени, потом я изменил на DISPLAY_DEVICE_A, а sizeof`е - забыл изменить.
Спасибо!

Добавлено через 1 час 8 минут
А как вообще анализируется возвращаемое значение флага StateFlags структуры DISPLAY_DEVICE:
Флаги состояния устройства. Это может быть любая разумная комбинация из следующих.
Там есть всего 5 пунктов и то "текстовые":
C++
1
2
3
4
5
6
DISPLAY_DEVICE_ACTIVE
DISPLAY_DEVICE_MIRRORING_DRIVER
DISPLAY_DEVICE_MODESPRUNED
DISPLAY_DEVICE_PRIMARY_DEVICE
DISPLAY_DEVICE_REMOVABLE
DISPLAY_DEVICE_VGA_COMPATIBLE
Но по файкту возвращаются:
-числовые значения
-и вариация этих значений больше чем 6 вариантов. Есть и 0 и 5 и 524288 и 524293...

В документации на этот счет вообще ничего не сказано.
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
21.05.2020, 15:19
Цитата Сообщение от Optimus11 Посмотреть сообщение
Там есть всего 5 пунктов и то "текстовые":
Это константы
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
#define DISPLAY_DEVICE_ATTACHED_TO_DESKTOP      0x00000001
#define DISPLAY_DEVICE_MULTI_DRIVER             0x00000002
#define DISPLAY_DEVICE_PRIMARY_DEVICE           0x00000004
#define DISPLAY_DEVICE_MIRRORING_DRIVER         0x00000008
#define DISPLAY_DEVICE_VGA_COMPATIBLE           0x00000010
#if (_WIN32_WINNT >= _WIN32_WINNT_WIN2K)
#define DISPLAY_DEVICE_REMOVABLE                0x00000020
#endif // (_WIN32_WINNT >= _WIN32_WINNT_WIN2K)
#if (_WIN32_WINNT >= _WIN32_WINNT_WIN8)
#define DISPLAY_DEVICE_ACC_DRIVER               0x00000040
#endif
#define DISPLAY_DEVICE_MODESPRUNED              0x08000000
#if (_WIN32_WINNT >= _WIN32_WINNT_WIN2K)
#define DISPLAY_DEVICE_RDPUDD                   0x01000000
#define DISPLAY_DEVICE_REMOTE                   0x04000000
#define DISPLAY_DEVICE_DISCONNECT               0x02000000
#endif
#define DISPLAY_DEVICE_TS_COMPATIBLE            0x00200000
#if (_WIN32_WINNT >= _WIN32_WINNT_LONGHORN)
#define DISPLAY_DEVICE_UNSAFE_MODES_ON          0x00080000
#endif
 
/* Child device state */
#if (_WIN32_WINNT >= _WIN32_WINNT_WIN2K)
#define DISPLAY_DEVICE_ACTIVE              0x00000001
#define DISPLAY_DEVICE_ATTACHED            0x00000002
#endif // (_WIN32_WINNT >= _WIN32_WINNT_WIN2K)
Добавлено через 2 минуты
Цитата Сообщение от Optimus11 Посмотреть сообщение
В документации на этот счет вообще ничего не сказано.
В смысле, ничего? Там вроде всё расписано

https://docs.microsoft.com/en-... ay_devicea
1
-41 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,915
21.05.2020, 16:33
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Это константы

В смысле, ничего? Там вроде всё расписано

https://docs.microsoft.com/en-... ay_devicea
Ну вот этих define же там нет ?

Добавлено через 10 минут
Вот просто пример:
Из описания EnumDisplayDevices:
Чтобы запросить все устройства отображения в текущем сеансе, вызовите эту функцию в цикле, начиная с iDevNum, установленной в 0, и увеличивая iDevNum, пока функция не завершится с ошибкой. Чтобы выбрать все устройства отображения на рабочем столе, используйте только устройства отображения, которые имеют флаг DISPLAY_DEVICE_ATTACHED_TO_DESKTOP в структуре DISPLAY_DEVICE .
Смотрим описание флагов структуры DISPLAY_DEVICE:
DISPLAY_DEVICE_ACTIVE
DISPLAY_DEVICE_MIRRORING_DRIVER
DISPLAY_DEVICE_MODESPRUNED
DISPLAY_DEVICE_PRIMARY_DEVICE
DISPLAY_DEVICE_REMOVABLE
DISPLAY_DEVICE_VGA_COMPATIBLE
Нет в структуре DISPLAY_DEVICE флага DISPLAY_DEVICE_ATTACHED_TO_DESKTOP.
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
21.05.2020, 16:55
Цитата Сообщение от Optimus11 Посмотреть сообщение
Нет в структуре DISPLAY_DEVICE флага DISPLAY_DEVICE_ATTACHED_TO_DES KTOP.
В смысле, нет в структуре? Это битовый флаг
C++
1
if (My_diplay_device.StateFlags & DISPLAY_DEVICE_ATTACHED_TO_DESKTOP) ............
1
-41 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,915
21.05.2020, 17:28
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
В смысле, нет в структуре? Это битовый флаг
C++
1
if (My_diplay_device.StateFlags & DISPLAY_DEVICE_ATTACHED_TO_DESKTOP) ............
А как это из описания понять возможно ? Что это битовый флаг, что нужно применить побитовую операцию & к полю StateFlags структуры DISPLAY_DEVICE и посмотреть результат этой операции и чему она должна быть равна и чему соответстотвать.
И что тогда такое вообще поле StateFlags - там же есть 6 каких то комбинаций, они тогда что значат ? Почему среди них нет DISPLAY_DEVICE_ATTACHED_TO_DESKTOP ?

Вот как это понять из этого описания ?
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
21.05.2020, 17:41
Цитата Сообщение от Optimus11 Посмотреть сообщение
А как это из описания понять возможно ? Что это битовый флаг, что нужно применить побитовую операцию & к полю StateFlags структуры DISPLAY_DEVICE и посмотреть результат этой операции и чему она должна быть равна и чему соответстотвать.
Вообще-то это базовые вещи, непонятно, почему они у тебя вызывают вопросы.
0
-41 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,915
21.05.2020, 17:45
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Вообще-то это базовые вещи, непонятно, почему они у тебя вызывают вопросы.
Ну получается не знаю базовых вещей, но, если бы я захотел их узнать, то как это понять, вот, как Вы поняли это из описания.

Я не прикалываюсь, я честно просто не понимаю. То есть, что я должен был изучать, что бы я мог бы понять, что нужно было применить побитовую операцию "и" ?
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
21.05.2020, 17:48
Цитата Сообщение от Optimus11 Посмотреть сообщение
Я не прикалываюсь, я честно просто не понимаю. То есть, что я должен был изучать, что бы я мог бы понять, что нужно было применить побитовую операцию "и" ?
StateFlags

Device state flags. It can be any reasonable combination of the following.
Это и означает побитовую комбинацию, для DWORD других не бывает
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
21.05.2020, 17:48
Помогаю со студенческими работами здесь

Нужна летиратура, в которой бы описывались работа с событиями, работа с элементами управления
Помогите пожалуйста найти летиратуру, в которой бы описывались работа с событиями,работа со всеми элементами управления(toolbox).И если...

Работа с Меню. Сохранение, печать, создать новый. Работа с рисованием
В общем сабж. Делается программа, которая должная Сохранять, печатать и очищать поле (создать новый/очистка). Также хочу спросить как...

Работа формы в фоне, вне фокуса (работа с раскладкой клавиатуры)
Как заставить это работать в фоне? Даный код работает пока форма в фокусе, как только ее отпускаем - она не реагирует. Public...

Количество подведенного и отведенного тепла, работа сжатия, работа расширения
Определить количество подведенного и отведенного тепла, работу сжатия, работу расширения, полезную работу и КПД цикла предыдущей...

Работа с файловой системой (системное название некоторых папок и работа со скрытыми документами)
Всем привет, подскажите каким образом можно из VBA сохранить документ txt в папке &quot;Общие документы&quot; и задать для него свойство...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[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-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru