Jump to content
Xtreme .Net Talk

Recommended Posts

Posted (edited)

Hi,

 

Not sure how useful this is to anyone but I had alot of trouble finding a VB.NET Screen Resolution Change functionality, so I managed to get it working, and the code is below.

 

Can be called by: ChangeRes(1024,768)

 

Any comments are welcome, as are bug fixes!!!!

 

 

Imports System.Runtime.InteropServices

Public Module resChanger

   Const ENUM_CURRENT_SETTINGS As Integer = -1
   Const CDS_UPDATEREGISTRY As Integer = &H1
   Const CDS_TEST As Long = &H2

   Const CCDEVICENAME As Integer = 32
   Const CCFORMNAME As Integer = 32

   Const DISP_CHANGE_SUCCESSFUL As Integer = 0
   Const DISP_CHANGE_RESTART As Integer = 1
   Const DISP_CHANGE_FAILED As Integer = -1

   Private Declare Function EnumDisplaySettings Lib "user32" Alias "EnumDisplaySettingsA" (ByVal lpszDeviceName As Integer, ByVal iModeNum As Integer, ByRef lpDevMode As DEVMODE) As Integer
   Private Declare Function ChangeDisplaySettings Lib "user32" Alias "ChangeDisplaySettingsA" (ByRef DEVMODE As DEVMODE, ByVal flags As Integer) As Integer

   <StructLayout(LayoutKind.Sequential)> Public Structure DEVMODE
       <MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst:=CCDEVICENAME)> 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 dmOrientation As Short
       Public dmPaperSize As Short
       Public dmPaperLength As Short
       Public dmPaperWidth As Short
       Public dmScale As Short
       Public dmCopies As Short
       Public dmDefaultSource As Short
       Public dmPrintQuality As Short
       Public dmColor As Short
       Public dmDuplex As Short
       Public dmYResolution As Short
       Public dmTTOption As Short
       Public dmCollate As Short
       <MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst:=CCFORMNAME)> Public dmFormName As String
       Public dmUnusedPadding As Short
       Public dmBitsPerPel As Short
       Public dmPelsWidth As Integer
       Public dmPelsHeight As Integer
       Public dmDisplayFlags As Integer
       Public dmDisplayFrequency As Integer
   End Structure

   Public Sub changeRes(ByVal theWidth As Integer, ByVal theHeight As Integer)

       Dim DevM As DEVMODE

       DevM.dmDeviceName = New [string](New Char(32) {})
       DevM.dmFormName = New [string](New Char(32) {})
       DevM.dmSize = CShort(Marshal.SizeOf(GetType(DEVMODE)))


       If 0 <> EnumDisplaySettings(Nothing, ENUM_CURRENT_SETTINGS, DevM) Then
           Dim lResult As Integer

           DevM.dmPelsWidth = theWidth
           DevM.dmPelsHeight = theHeight
           DevM.dmPelsWidth = 1280
           DevM.dmPelsHeight = 1024

           lResult = ChangeDisplaySettings(DevM, CDS_TEST)

           If lResult = DISP_CHANGE_FAILED Then
               MsgBox("Display Change Failed.", MsgBoxStyle.OKOnly + MsgBoxStyle.Critical, "Screen Resolution Change Failed")
           Else

               lResult = ChangeDisplaySettings(DevM, CDS_UPDATEREGISTRY)

               Select Case lResult
                   Case DISP_CHANGE_RESTART
                       MsgBox("You must restart your computer to apply these changes.", MsgBoxStyle.OKOnly + MsgBoxStyle.Critical, "Screen Resolution Has Changed")
                   Case DISP_CHANGE_SUCCESSFUL
                       MsgBox("Display Change Successful.", MsgBoxStyle.OKOnly + MsgBoxStyle.Information, "Screen Resolution Successful")
                   Case Else
                       MsgBox("Display Change Failed.", MsgBoxStyle.OKOnly + MsgBoxStyle.Critical, "Screen Resolution Change Failed")
               End Select
           End If


       End If
   End Sub

End Module

Edited by snarfblam
Posted
But i guess you need permissions to execute that on the client computer. (Not every user has the right to change his/her screen resolution) So you have to be careful using it in your application. :)
Dream as if you'll live forever, live as if you'll die today
Posted
I am not sure if it will handle it, because once you try to change the resoltuion through code and the user running your application has no permission to do so then it will through a security exception, This exception is not caught any where in your code. So i guess you should use some error handling (Try .. Catch)
Dream as if you'll live forever, live as if you'll die today
Posted
For my application everyone will have priveleges to change screen res so its not an issue for me, anyone else who uses it may want to take that into account though.
  • 4 years later...
Posted

i tryed with your code,

 

i im getting the error when i reach the line

 

lResult = ChangeDisplaySettings(DevM, CDS_TEST)

 

Error i got is...

 

PInvokeStackImbalance was detected

 

A call to PInvoke function 'Resolution!Resolution.resChanger::ChangeDisplaySettings' has unbalanced the stack. This is likely because the managed PInvoke signature does not match the unmanaged target signature. Check that the calling convention and parameters of the PInvoke signature match the target unmanaged signature.

 

can u give the solution...

  • Leaders
Posted

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

should be

Private Declare Function ChangeDisplaySettings Lib "user32" Alias "ChangeDisplaySettingsA" (ByRef DEVMODE As DEVMODE, ByVal flags As [b][i]Integer[/i][/b]) As Integer

[sIGPIC]e[/sIGPIC]
  • 2 years later...
Posted

Works perfectly well but just check line 62 and 63 and set line 60 and 61 to the width and the height

 

ie

 

DevM.dmPelsWidth = theWidth

DevM.dmPelsHeight = theHeight

' DevM.dmPelsWidth = 1024

' DevM.dmPelsHeight = 768

  • 6 months later...
Posted

Hi, thanks for the sample code.

 

- Can this be adapted to support multiple displays?

- How about for activating/deactivating displays?

- What if a user has a TV out from their video card, how to detect and support changing supported resolutions on it?

 

Thanks

  • Leaders
Posted

Hi ScottN. It's generally best to put a new question in its own thread, with a link to a related thread if appropriate.

 

- Can this be adapted to support multiple displays?

[/Quote]

The Screen class can get info about mulitple displays. I don't know how to change settings for multiple displays.

 

- How about for activating/deactivating displays?

- What if a user has a TV out from their video card, how to detect and support changing supported resolutions on it?

I would expect the TV out to behave as a normal display. As for detecting changes and activating/deactivating, again, I don't know.

[sIGPIC]e[/sIGPIC]
  • 2 months later...
Posted

Did you mean to ignore the parameters and force one setting?:

 

If 0 <> EnumDisplaySettings(Nothing, ENUM_CURRENT_SETTINGS, DevM) Then

Dim lResult As Integer

 

DevM.dmPelsWidth = theWidth

DevM.dmPelsHeight = theHeight

DevM.dmPelsWidth = 1280

DevM.dmPelsHeight = 1024

  • 2 months later...
Posted (edited)

Agree with you.... also have same thought.

 

But i guess you need permissions to execute that on the client computer. (Not every user Get GED Online has the right to change his/her screen resolution) So you have to be careful using it in your application. :)
Edited by andrew15
Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...