Click here to Skip to main content
16,017,261 members
Please Sign up or sign in to vote.
4.00/5 (1 vote)
See more:
VB
Imports System.Runtime.InteropServices
Public Class Resolution

    Public HOR_SIZE_CHANGESCR_RES, VER_SIZE_CHANGESCR_RES As Integer

    Private Sub Button1_Click( sender As Object,  e As EventArgs) Handles Button1.Click

        ChangeScrRes.ChangeResolution(768, 1024, 60, 1)
    End Sub

End Class

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Ansi)> _
Friend Structure DEVMODE

    <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=32)> _
    Public dmDeviceName As String
    Public dmSpecVersion As Short
    Public dmDriverVersion As Short
    Public dmSize As Short
    Public dmDriverExtra As Short
    Public dmFields As Integer
    Public dmPositionX As Integer
    Public dmPositionY As Integer
    Public dmDisplayOrientation As Integer
    Public dmDisplayFixedOutput As Integer
    Public dmColor As Short
    Public dmDuplex As Short
    Public dmYResolution As Short
    Public dmTTOption As Short
    Public dmCollate As Short
    <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=32)> _
    Public dmFormName As String
    Public dmLogPixels As Short
    Public dmBitsPerPel As Short
    Public dmPelsWidth As Integer
    Public dmPelsHeight As Integer
    Public dmDisplayFlags As Integer
    Public dmDisplayFrequency As Integer
    Public dmICMMethod As Integer
    Public dmICMIntent As Integer
    Public dmMediaType As Integer
    Public dmDitherType As Integer
    Public dmReserved1 As Integer
    Public dmReserved2 As Integer
    Public dmPanningWidth As Integer
    Public dmPanningHeight As Integer
End Structure

Friend Class NativeMethods

    <DllImport("user32.dll", CharSet:=CharSet.Ansi)> _
    Public Shared Function EnumDisplaySettings( _
    ByVal lpszDeviceName As String, _
    ByVal iModeNum As Integer, _
    ByRef lpDevMode As DEVMODE) As Integer
    End Function

    <DllImport("user32.dll", CharSet:=CharSet.Ansi)> _
    Public Shared Function ChangeDisplaySettings( _
    ByRef lpDevMode As DEVMODE, _
    ByVal dwFlags As Integer) As Integer
    End Function

End Class

Public Class ChangeScrRes

    Private Shared Function CreateDevMode() As DEVMODE
        Dim dm As New DEVMODE
        dm.dmDeviceName = New String(New Char(32) {})
        dm.dmFormName = New String(New Char(32) {})
        dm.dmSize = CShort(Marshal.SizeOf(dm))
        Return dm
    End Function

    Public Enum DisplayChangeResultCode
        DISP_CHANGE_SUCCESSFUL = 0
        DISP_CHANGE_RESTART = 1
        DISP_CHANGE_FAILED = -1
        DISP_CHANGE_BADMODE = -2
        DISP_CHANGE_NOTUPDATED = -3
        DISP_CHANGE_BADFLAGS = -4
        DISP_CHANGE_BADPARAM = -5
        DISP_CHANGE_BADDUALVIEW = -6
    End Enum

    Public Shared Sub ChangeResolution(ByVal width As Integer, ByVal height As Integer, ByVal freq As Integer, ByVal orientation As Integer)

        Const DM_PELSWIDTH As Integer = &H80000
        Const DM_PELSHEIGHT As Integer = &H100000
        Const DM_DISPLAYFREQUENCY As Integer = &H400000
        Const ENUM_CURRENT_SETTINGS As Integer = -1
        Dim DevM As DEVMODE = CreateDevMode()
        Dim enumResult As Integer
        Dim changeResult As DisplayChangeResultCode

        DevM.dmFields = DM_PELSWIDTH Or DM_PELSHEIGHT Or DM_DISPLAYFREQUENCY

        enumResult = NativeMethods.EnumDisplaySettings(Nothing, ENUM_CURRENT_SETTINGS, DevM)

        DevM.dmPelsWidth = width
        DevM.dmPelsHeight = height
        DevM.dmDisplayFrequency = freq
        DevM.dmDisplayOrientation = orientation

        changeResult = CType(NativeMethods.ChangeDisplaySettings(DevM, 0), DisplayChangeResultCode)

        If changeResult <> DisplayChangeResultCode.DISP_CHANGE_SUCCESSFUL Then
            Throw New Exception("Failed to change resolution: " & changeResult.ToString)
        End If
    End Sub

End Class


This is really nice piece of code I got for changing the screen resolution and orientation. I have one question though. On a windows 7 pc the screen orientation change works perfectly, but on windows xp it does not work. It throws a DISPLAY_CHANGE_BADMODE error.

If anyone have an idea how to use this on windows xp please help.
Posted
Comments
[no name] 7-Jul-12 23:32pm    
It could be because Windows XP and Windows Vista & 7 have a new driver model, but I'm not sure. Just thought I'd let you know since no one answered your question.

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900