VB.NET --> Screen Resolution Change Example Complete!
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!!!!
Code:
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
Last edited by snarfblam; 02-16-2011 at 04:32 PM.
Reason: Corrected API declaration
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
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
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.
Re: VB.NET --> Screen Resolution Change Example Complete!
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.
Re: VB.NET --> Screen Resolution Change Example Complete!
Code:
Private Declare Function ChangeDisplaySettings Lib "user32" Alias "ChangeDisplaySettingsA" (ByRef DEVMODE As DEVMODE, ByVal flags As Long) As Integer
should be
Code:
Private Declare Function ChangeDisplaySettings Lib "user32" Alias "ChangeDisplaySettingsA" (ByRef DEVMODE As DEVMODE, ByVal flags As Integer) As Integer
Re: VB.NET --> Screen Resolution Change Example Complete!
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?
Re: VB.NET --> Screen Resolution Change Example Complete!
Hi ScottN. It's generally best to put a new question in its own thread, with a link to a related thread if appropriate.
Quote:
Originally Posted by ScottN
- Can this be adapted to support multiple displays?
The Screen class can get info about mulitple displays. I don't know how to change settings for multiple displays.
Quote:
Originally Posted by ScottN
- 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.
Re: VB.NET --> Screen Resolution Change Example Complete!
Agree with you.... also have same thought.
Quote:
Originally Posted by Mehyar
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.
The ASP.NET 2.0 Anthology
101 Essential Tips, Tricks & Hacks - Free 156 Page Preview. Learn the most practical features and best approaches for ASP.NET. subscribe