На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Обратите внимание:
1. Прежде чем начать новую тему или отправить сообщение, убедитесь, что вы не нарушаете правил форума!
2. Обязательно воспользуйтесь поиском. Возможно, Ваш вопрос уже обсуждали. Полезные ссылки приведены ниже.
3. Темы с просьбой выполнить какую-либо работу за автора в этом разделе не обсуждаются.
4. Используйте теги [ code=cpp ] ...текст программы... [ /code ] для выделения текста программы подсветкой.
5. Помните, здесь телепатов нет. Старайтесь формулировать свой вопрос максимально грамотно и чётко: Как правильно задавать вопросы
6. Запрещено отвечать в темы месячной и более давности без веских на то причин.

Полезные ссылки:
user posted image FAQ Сайта (C++) user posted image FAQ Форума user posted image Наши Исходники user posted image Поиск по Разделу user posted image MSDN Library Online (Windows Driver Kit) user posted image Google

Ваше мнение о модераторах: user posted image B.V.
Модераторы: B.V.
  
> Определение параметров видеосистемы ПК
    В программе определяю адаптер и монитор:
    ExpandedWrap disabled
      #include <string>
      #include <iostream>
      #include <Windows.h>
       
      using namespace std;
       
      void GetVideoInfo()
      {
        setlocale(LC_ALL, "");
        DISPLAY_DEVICE sDispDev = {0};
        sDispDev.cb = sizeof(DISPLAY_DEVICE);
        if(EnumDisplayDevices(NULL, 0, &sDispDev, 0))
        {
          cout << "Адаптер: " << sDispDev.DeviceString << endl;
        }
        else
        {
          cout << "Не удалось найти информацию об адаптере!" << endl;
          system("\npause");
          exit(EXIT_FAILURE);
        }
        if(EnumDisplayDevices(sDispDev.DeviceName, 0, &sDispDev, 0))
        {
          cout << sDispDev.DeviceString << endl;
        }
        else
        {
          cout << "Не удалось найти информацию о дисплее!" << endl;
          system("\npause");
          exit(EXIT_FAILURE);
        }
      }
       
      int main()
      {
        GetVideoInfo();
        system("\npause");
      }
    Адаптер определяется правильно, а монитор определить не удалось. Подскажите, пожалуйста, что я делаю неправильно при повторном вызове (EnumDisplayDevices? Проект прикрепил.
    Прикреплённый файлПрикреплённый файлCppStudyCons.zip (2,07 Кбайт, скачиваний: 99)
    Сообщение отредактировано: tuchin -
      Читай описание функции: https://msdn.microsoft.com/ru-ru/library/wi...9(v=vs.85).aspx или на русском: http://www.vsokovikov.narod.ru/New_MSDN_AP...playdevices.htm
      Цитата

      Чтобы получить информацию об адаптере дисплея, вызовите EnumDisplayDevices с параметром lpDevice, установленным в ПУСТО (NULL). Например, DISPLAY_DEVICE.DeviceString содержит имя адаптера.

      Чтобы получить информацию об экранном мониторе, сначала вызовите функцию EnumDisplayDevices с параметром lpDevice, установленным в ПУСТО (NULL). Затем вызовите EnumDisplayDevices с параметром lpDevice установленным в DISPLAY_DEVICE.DeviceName от первого вызова EnumDisplayDevices и с параметром iDevNum установленным в нуль . Тогда DISPLAY_DEVICE.DeviceString - это название монитора.

      Вот твой исправленный, рабочий пример:
      ExpandedWrap disabled
        #include <string>
        #include <iostream>
        #include <Windows.h>
         
        using namespace std;
         
        void GetVideoInfo()
        {
            setlocale(LC_ALL, "");
            DISPLAY_DEVICE sDispDev = { 0 };
            sDispDev.cb = sizeof(DISPLAY_DEVICE);
            if (EnumDisplayDevices(NULL, 0, &sDispDev, 0))
            {
                cout << "Адаптер: " << sDispDev.DeviceString << endl;
            }
            else
            {
                cout << "Не удалось найти информацию об адаптере!" << endl;
                system("\npause");
                exit(EXIT_FAILURE);
            }
            if (EnumDisplayDevices(NULL, 0, &sDispDev, 0))
            {
                cout << sDispDev.DeviceString << endl;
            }
         
            std::wstring devName = sDispDev.DeviceName;
         
            if (EnumDisplayDevices(devName.c_str(), 0, &sDispDev, 0))
            {
                cout << sDispDev.DeviceName << endl;
            }
            else
            {
                cout << "Не удалось найти информацию о дисплее!" << endl;
                system("\npause");
            }
        }
         
        int main()
        {
            GetVideoInfo();
            system("\npause");
        }


      Добавлено
      Аа, к слову я там просмотрел первый вызов этой функции у тебя. Ну кароч ты понял в чем ошибка была думаю.
      Сообщение отредактировано: KILLER -
        В EnumDisplayDevices нужно передавать индекс устройства, информацию о котором ты хочешь получить. Попробуй пробежаться по всем девайсам. Как-то так

        ExpandedWrap disabled
                  DISPLAY_DEVICE dev1 = {0};
                  dev1.cb = sizeof(DISPLAY_DEVICE);
                  for (int i = 0; EnumDisplayDevices(NULL, i, &dev1, 0); ++i)
                  {
                      LOG_DEBUG << i << dev1.DeviceName;
                      DISPLAY_DEVICE dev2 = {0};
                      dev2.cb = sizeof(DISPLAY_DEVICE);
                      for (int j = 0; EnumDisplayDevices(dev1.DeviceName, j, &dev2, 0); ++j)
                      {
                          LOG_DEBUG << i << j << dev2.DeviceName;
                      }
                  }
          Олег МСпасибо большое за ответ. Все получилось. Только я не понял, что такое LOG_DEBUG? Из-за незнания я использовал cout.
            M
            Не забываем про использование функции "Вопрос решён!"
              Цитата tuchin @
              Только я не понял, что такое LOG_DEBUG?

              Такая же фигня... Что за LOG_DEBUG - ума не приложить. Считай это просто аналогом std::cout, но у него наверное это макрос, который выводит результат выполнения программы в файл.
                Цитата KILLER @
                Что за LOG_DEBUG - ума не приложить. Считай это просто аналогом std::cout, но у него наверное это макрос, который выводит результат выполнения программы в файл.

                Не обязательно в файл, не обязательно только в файл. Любой вменяемый логгер можно при необходимости настроить на серию таргетов: начиная от тривиального файла и заканчивая trace-окошком в любимой IDE.
                  Цитата B.V. @
                  Только я не понял, что такое LOG_DEBUG? Из-за незнания я использовал cout

                  Это мои макросы. Забыл заменить на cout, когда выкладывал.
                    Попробовал теперь изменить частоту дисплея:
                    ExpandedWrap disabled
                      void GetDisplayFrequency()
                      {
                        HDC hdcScreen = GetDC(NULL);
                        cout << "Параметр: " << GetDeviceCaps(hdcScreen, VREFRESH) << endl;
                      }
                       
                      void SetDisplayFrequency()
                      {
                        DEVMODE dm;
                        memset(&dm, 0, sizeof(DEVMODE));
                        dm.dmSize = sizeof(DEVMODE);
                        dm.dmDisplayFrequency = 75;
                        dm.dmFields = dm.dmDisplayFrequency;
                        if(DISP_CHANGE_SUCCESSFUL !=  ChangeDisplaySettings(&dm, 0))
                        {
                          cout << "Не удалось изменить кадровую частоту!" << endl;
                        }
                      }
                       
                      int main()
                      {
                        setlocale(LC_ALL, "");
                        GetDisplayFrequency();
                        SetDisplayFrequency();
                        GetDisplayFrequency();
                        system("\npause");
                      }
                    Частота 60 Гц, пытаюсь изменить на 75 Гц. Частота не изменяется. Что я делаю неправильно?
                      Посмотри, какое значение возвращает ChangeDisplaySettings

                      Добавлено
                      Там много чего может быть
                        Цитата tuchin @
                        Частота 60 Гц, пытаюсь изменить на 75 Гц. Частота не изменяется. Что я делаю неправильно?

                        Монитор то поддерживает 75гц?
                          Цитата tuchin @
                          Частота 60 Гц, пытаюсь изменить на 75 Гц. Частота не изменяется. Что я делаю неправильно?

                          Какой монитор? Какое разрешение экрана?
                            1. ChangeDisplaySettings возвращает 0 (DISP_CHANGE_SUCCESSFUL)
                            2. Монитор и адаптер поддерживает 75 Гц, при выборе определенного режима с помощью Панель управления-Экран-Настройка разрешения экрана-Дополнительные параметры-Список всех режимов выбранный режим устанавливается нормально, в том числе и режим с 75 Гц.
                            Может быть не устанавливается потому, что я не задаю какой-то нужный параметр dm, например dm.dmDeviceName?
                            Сообщение отредактировано: tuchin -
                              Там еще есть ChangeDisplaySettingsEx, попробуй через неё.Ну и поиграться с dwflags
                                А какие функции позволяют определить и изменить яркость экрана? Вроде бы этот вопрос подходит к этой теме.
                                    Filka Спасибо
                                    Сообщение отредактировано: tumanovalex -
                                    0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                    0 пользователей:


                                    Рейтинг@Mail.ru
                                    [ Script execution time: 0,0487 ]   [ 18 queries used ]   [ Generated: 23.04.24, 16:08 GMT ]