joshuaand Posted December 2, 2003 Posted December 2, 2003 (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 February 16, 2011 by snarfblam Quote
Mehyar Posted December 2, 2003 Posted December 2, 2003 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. :) Quote Dream as if you'll live forever, live as if you'll die today
joshuaand Posted December 2, 2003 Author Posted December 2, 2003 I havent tried it but I am assuming it will just fail to update the res, and should be handled correctly? not sure though. Quote
Mehyar Posted December 2, 2003 Posted December 2, 2003 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) Quote Dream as if you'll live forever, live as if you'll die today
joshuaand Posted December 2, 2003 Author Posted December 2, 2003 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. Quote
chandru08 Posted January 24, 2008 Posted January 24, 2008 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... Quote
Leaders snarfblam Posted January 30, 2008 Leaders Posted January 30, 2008 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 Quote [sIGPIC]e[/sIGPIC]
ikebotch Posted August 2, 2010 Posted August 2, 2010 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 Quote
ScottN Posted February 16, 2011 Posted February 16, 2011 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 Quote
Leaders snarfblam Posted February 16, 2011 Leaders Posted February 16, 2011 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. Quote [sIGPIC]e[/sIGPIC]
ken thompson Posted May 5, 2011 Posted May 5, 2011 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 Quote
andrew15 Posted July 6, 2011 Posted July 6, 2011 (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 July 7, 2011 by andrew15 Quote
Recommended Posts