Как поменять разрешение экрана ( десктопа )

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

Fedorfx
Постоялец
Постоялец
 
Сообщения: 371
Зарегистрирован: 10.10.2002 (Чт) 0:14

Как поменять разрешение экрана ( десктопа )

Сообщение Fedorfx » 19.06.2009 (Пт) 19:03

Привет
помогите поменять разрешение десктопа
разрешения стандартные — что поддерживает видеокарта
просмотрел несколько примеров на с — но немогу заставить работать код на Vb
делаю так
Код: Выделить всё
        Dim DevM As New DEVMODE
        DevM.dmDeviceName = "12345678901234567890123456789012"
        DevM.dmFormName = "a2345678901234567890123456789012"
        DevM.dmSize = Marshal.SizeOf(DevM)

        DevM.dmPelsWidth = 1024
        DevM.dmPelsHeight = 768
        Dim CDS_UPDATEREGISTRY As Integer = 1

        Dim ret As Integer = ChangeDisplaySettings(DevM, CDS_UPDATEREGISTRY)


структура и функции обьявлены так

    Private Declare Function ChangeDisplaySettings Lib "user32" Alias "ChangeDisplaySettingsA" (ByRef lpDevMode As DEVMODE, ByVal dwFlags As Integer) As Integer


    <StructLayout(LayoutKind.Sequential)> _
    Public Structure DEVMODE
        Private Const CCHDEVICENAME As Integer = 32
        Private Const CCHFORMNAME As Integer = 32

        <VBFixedString(CCHDEVICENAME), MarshalAs(UnmanagedType.ByValTStr, SizeConst:=CCHDEVICENAME)> _
        Dim dmDeviceName As String
        Dim dmSpecVersion As Short
        Dim dmDriverVersion As Short
        Dim dmSize As Short
        Dim dmDriverExtra As Short
        Dim dmFields As Integer

        Dim dmOrientation As Short
        Dim dmPaperSize As Short
        Dim dmPaperLength As Short
        Dim dmPaperWidth As Short

        Dim dmScale As Short
        Dim dmCopies As Short
        Dim dmDefaultSource As Short
        Dim dmPrintQuality As Short
        Dim dmColor As Short
        Dim dmDuplex As Short
        Dim dmYResolution As Short
        Dim dmTTOption As Short
        Dim dmCollate As Short
        <VBFixedString(CCHFORMNAME), MarshalAs(UnmanagedType.ByValTStr, SizeConst:=CCHFORMNAME)> _
        Dim dmFormName As String
        Dim dmLogPixels As Short
        Dim dmBitsPerPel As Integer
        Dim dmPelsWidth As Integer
        Dim dmPelsHeight As Integer
        Dim dmDisplayFlags As Integer
        Dim dmDisplayFrequency As Integer

        Dim dmICMMethod As Integer
        Dim dmICMIntent As Integer
        Dim dmMediaType As Integer
        Dim dmDitherType As Integer
        Dim dmReserved1 As Integer
        Dim dmReserved2 As Integer
        Dim dmPanningWidth As Integer
        Dim dmPanningHeight As Integer
    End Structure



функция возвращает 0 — что по идее указывает что она отработала успешно но с экраном ничего не происходит

Joo
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 762
Зарегистрирован: 14.08.2008 (Чт) 11:55
Откуда: Казахстан

Re: Как поменять разрешение экрана ( десктопа )

Сообщение Joo » 20.06.2009 (Сб) 10:12

Копипаст (раньше сам юзал):
Изменение настроек дисплея

При написании игрушек и различных приложений связаных с графикой очень хочется
поменять разрешения монитора. И это достаточно легко сделать:

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
"Им будет не просто, тем кто полагается на истину авторитета, вместо того чтобы полагаться на авторитет Истины"
Джеральд Месси, Египтолог


Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 93

    TopList