Дата публикации статьи: 09.07.2003 00:00

При написании игрушек и различных приложений связаных с графикой очень хочется поменять разрешения монитора. И это достаточно легко сделать: Declare Function ChangeDisplaySettings Lib "user32.dll" Alias "ChangeDisplaySettingsA"_ (lpDevMode As Any, ByVal dwFlags As Long) As Long

С помощью этой функции появляется возможность изменить разрешение и количество цветовых разрядов.

Данная функция содержит набор параметров:

lpDevMode – новые настройки для монитора (структура DevMode ) возможно использование значений:
dmBitsPerPixe
dmDisplayFlags
dmDisplayFrequency
dmPelsWidth
dmPelsHeigh
dwFlags – способ изменения настроек, если здесь не установить ничего, то настройки будут изменены во время выполнения вызова этой функции, а информация об изменении не будет сохранена вообще.

Набор параметров:

* CDS_NORESET – все изменения будут сохранены в реестре Windows, но сами вступят в силу только после перезагрузки компьютера
CDS_RESET– параметры настройки изменяются по ходу выполнения, без перезагрузки системы.
*CDS_GLOBAL – настройки будут установлены для всех пользователей системы (если их несколько)
CDS_FULLSCREEN – установка полноэкранного режима, но эту установку нельзя сохранить вообще.
CDS_TEST– режим проверки монитора, для установления совместимости устройства с устанавливаемыми параметрами.

Для параметров отмеченных * нужно определить CDS_UPDATEREGISTRY= &H1 – обновление содержимого реестра

Функция возвращает следующие значения:

DISP_CHANGE_SUCCESSFUL –Изменение настроек прошло успешно
DISP_CHANGE_RESTART – необходимо перезапустить систему
DISP_CHANGE_BADPARAM – присутствует недопустимый параметр
DISP_CHANGE_FAILED – режим не поддерживается драйвером устройства
DISP_CHANGE_BADMODE - режим не поддерживается устройством
DISP_CHANGE_NOTUPDATED – запись в реестр не может быть осуществлена (характерно для Windows NT)

Также, при использовании этой функции полезно использовать другую функцию, определяющуу возможности устройств и драйверов:

Declare Function EnumDisplaySettings Lib "user32.dll" Alias "EnumDisplaySettingsA" (ByVal lpszDeviceName As String, ByVal iModeNum As Long, lpDevMode As DevMode) As Long

iModeNum – получение информации о текущем режиме или из реестра (ENUM_CURRENT_SETTINGS
ENUM_REGISTRY_SETTINGS)

lpDevMode – определяется то, что собственно хочется получить ( значения те же, что в ChangeDisplaySettings)

Пример использования этих функций:

На форму (frmTest) разместите кнопку cmdCDS, добавте следующий код:

----в код формы---

Private Sub CmdCDS_Click()
MyDevMode.dmSize = Len(MyDevMode)
BackVal = EnumDisplaySettings(vbNullString, ENUM_CURRENT_SETTINGS, MyDevMode)

MyDevMode.dmPelsWidth = 1024
MyDevMode.dmPelsHeight = 768
BackVal = ChangeDisplaySettings(MyDevMode, CDS_TEST)
If BackVal <> DISP_CHANGE_SUCCESSFUL Then
msgbox"Не могу установить такое разрешение!",16,"Ошибка!"
Else
BackVal = ChangeDisplaySettings(MyCevMode, CDS_UPDATEREGISTRY)
Select Case BackVal
Case DISP_CHANGE_SUCCESSFUL
msgbox"Нjвые установки применены!",64,"Ура!"
Case DISP_CHANGE_RESTART
dim iMsg as integer
iMsg = msgbox ("Можно перезагрузить?",36 ,"Перезагрузка!")
Select Case iMsg
case vbYes
Shell(‘%systemDir%/rundll32.exe user32,ExitWindows’) ‘Еще один способ перезагрузки
‘вместо %systemDir% установите путь к вашей системной папке undll32.exe
case vbNo
end select
Case Else
msgbox"Ничего не получилось",16,"Oops!"
End Select
End If
End Sub



Private Sub Form_Load()
msgbox"Пример изменения настроек монитора!",48,"Пример!"
End Sub


--- в код модуля ---

Public Declare Function ChangeDisplaySettings Lib "user32.dll" Alias "ChangeDisplaySettingsA"_ (lpDevMode As Any, ByVal dwFlags As Long) As Long

Public Declare Function EnumDisplaySettings Lib "user32.dll" Alias "EnumDisplaySettingsA" (ByVal lpszDeviceName As String, ByVal iModeNum As Long, lpDevMode As DevMode) As Long

Public MyDevMode As DevMode
Public BackVal As Long



Если понадобится перезагрузить компьютер, вы можете воспользоваться тем методом, что я привел выше, но тогда это будет работать только на вашем компьютере, а можно использовать функцию:


Declare Function ExitWindowsEx Lib "user32" (ByVal uFlags As Long, ByVal dwReserved As Long) As Long
(в модуль)

Public EW as Integer
Public Declare Function ExitWindowsEx Lib "user32" (ByVal uFlags As Long, ByVal dwReserved As Long) As Long)

А в код формы вместо старого способа:


EW = ExitWindoweEx(EWX_REBOOT,0) ‘Перезагрузка
( ExitWindowsEx(EWX_FORCE,0)’закрыть все приложения без предложения сохранить изменения)


P.S. Кстати, если кто не понял еще, часть функций можно использовать с командной строки

Rundll32.exe [Lib],[{Параметры}]

Lib = user32,kernel32, winmm.dll, shell32.dll, gdi.dll, comdlg.dll