Как добиться от монитора его характеристик: разрешения, тактовой частоты и пр.?
А поменять? Легко! Есть несколько WinAPI функций. Фактически, приведу только
список функций, приводить подробности глупо – поскольку все они есть в MSDN. В
том же MSDN в конце каждого описания функции есть ссылки на близкие по
назначению функции.
Как получить
разрешение
GetDeviceCaps
int GetDeviceCaps( HDC hdc, // хэндл контекста устройства int nIndex // "индекс возможностей” – индекс запрашиваемой характеристики );
Вернёт
для вашего HDC всё что попросите. Попросить можно nIndex. Полный список
возможных вопросов Вы найдёте в MSDN. Если вам нужно разрешение монитора (в
пикселях), то действовать можно вот так:
HDC hdcScreen = GetWindowDC(GetDesktopWindow()); int nXRes = GetDeviceCaps(hdcScreen, HORZRES); //взять разрешение по горизонтали int nYRes = GetDeviceCaps(hdcScreen, VERTRES); //взять разрешение по вертикали
Обращу
внимание, что эта функция может применяться не только к монитору, но и ко всему,
что может иметь HDC, например, к принтеру. Кстати, с помощью nIndex = TECHNOLOGY
можно получить по контексту устройства информацию о том, с чем же вы на самом
деле имеете дело. Тактовую частоту (в Гц) обновления можно получить с помощью
VREFRESH (правда, работать это будет лишь в Windows NT/2000).
Ещё одна
интересная функция, в сторону которой стоит посмотреть:
GetSystemMetrics
Перед тем как поменять
настройки монитора, необходимо заполнить структуру DEVMODE. Это можно сделать с
помощью функции EnumDisplaySettings
Эта
функция перечисляет все возможные характеристики дисплея. Первый параметр,
lpszDeviceName, обозначает дисплей, для которого вы хотите перечислить
характеристики. В общем то вы можете передать и NULL, но у MS есть проблемы при
работе с много мониторными системами, особенно если у них отличающиеся
характеристики. В этом случае вы должны передать "\\.\DisplayX", где Х может
принять значение 1, 2, или 3. Каждый монитор имеет свою коллекцию настроек,
которые может поддерживать (каждый, кто копался в настройках монитора, их
видел). iModeNum показывает номер "настройки" (пресета) в коллекции, который Вы
хотите получить (первый пресета имеет №0). Возвращаемые значения настроек вы
найдёте в параметре DEVMODE. DEVMODE имеет множество членов, но только 5 из них
относятся к дисплеям.
Поменять разрешение монитора можно функцией
ChangeDisplaySettings
Вот её прототип:
LONG ChangeDisplaySettings( LPDEVMODE lpDevMode, // графический режим DWORD dwflags // опция графического режима );
Если
вам необходимо, что бы после завершения работы программы настройки монитора
вернулись в исходное положение, ни в коем случае не устанавливайте флаг dwflags
CDS_UPDATEREGISTRY, который разрешает прописывать обновлённые настройки монитора
в реестр.
Если Вам необходимо поменять характеристики иного (не
дисплея) устройсва, то в руки вам попадает функция
ChangeDisplaySettingsEx:
LONG ChangeDisplaySettingsEx( LPCTSTR lpszDeviceName, // name of display device LPDEVMODE lpDevMode, // graphics mode HWND hwnd, // not used; must be NULL DWORD dwflags, // graphics mode options LPVOID lParam // video parameters (or NULL) );
Подробно
описывать её не буду – если Вы добрались до программирования плоттеров и т.п. –
то скорее всего Вы уже не читаете ФАК, а, возможно, пишете его.