Click here to Skip to main content
15,868,154 members
Articles / Programming Languages / C#
Article

Dynamic Screen Resolution

Rate me:
Please Sign up or sign in to vote.
4.45/5 (57 votes)
22 Jul 2008CPOL3 min read 514.3K   17.3K   101   87
Setting the Screen Resolution in C#

Introduction

I had a hard time in setting a dynamic screen resolution when I was doing some thick client application for a test suite. I presume that most of us have had this happen to us, or have faced such times somewhere along our engineering life cycle. Because, as we all know, the resolution of the user screen may not be same as that of the development environment screen.

This article expects to deliver what I found as a solution for the discussed challenge.

The forthcoming part of this literature will communicate about:

  • How to get the end user screen resolution
  • How to change the user screen resolution to product compatible
  • How to safeguard the user screen resolution

How to Get the End User Screen Resolution

Accessing the user screen is being eased by the availing Screen class which is shipped along with the .NET framework. And can access the current user screen resolution through a static Screen.PrimaryScreen property available in the Screen class.

C#
public static Screen PrimaryScreen {get;}

The aforementioned property is read only and returns a Screen type. And the below given logic demonstrates how to make use of the Screen type to access the user screen resolution.

C#
Screen screen = Screen.PrimaryScreen;
int S_width=screen.Bounds.Width;
int S_height=screen.Bounds.Height;

How to Change the User Screen Resolution to Product Compatible

Before heading towards our next goal, let me talk about the unmanaged part of this implementation. Unlike traditional languages, the .NET framework holds a distinct step while leveraging both managed and unmanaged code. Personally, when I wrote this article, I never found any managed code which does this resolution treatment. And this is what made me think to explore some Win32 API’s.

Before continuing, I would request you to have hands on or theoretical knowledge about: COM Interop service, Attribute, DLL import attribute and Platform Invoke.

Since the scope of this article is limited to managed code, I will not be discussing anything about unmanaged code. But, despite that fact, we can use the DllImport attribute to read the definition of unmanaged code to your managed environment. In this case, we will be using the User32.dll API, which facilitates the dynamic resolution and has two functions related to changing the screen resolution.

  • EnumDisplaySettings
  • ChangeDisplaySettings
C#
class User32
{
        [DllImport("user32.dll")]
        public static extern int EnumDisplaySettings (
          string deviceName, int modeNum, ref DEVMODE devMode );         
        [DllImport("user32.dll")]
        public static extern int ChangeDisplaySettings(
              ref DEVMODE devMode, int flags); 
 
        public const int ENUM_CURRENT_SETTINGS = -1;
        public const int CDS_UPDATEREGISTRY = 0x01;
        public const int CDS_TEST = 0x02;
        public const int DISP_CHANGE_SUCCESSFUL = 0;
        public const int DISP_CHANGE_RESTART = 1;
        public const int DISP_CHANGE_FAILED = -1;
}

As we know, the [DllImport("user32.dll")] is an explicit groundwork before injecting an unmanaged implementation in our managed environment.

C#
public static extern int EnumDisplaySettings 
    (string deviceName, int modeNum, ref DEVMODE devMode);

DEVMODE is a structure that is explained in the platform documentation as well as included with Visual Studio .NET. The structure is defined in C#.

C#
[StructLayout(LayoutKind.Sequential)]
public struct DEVMODE 
{
        [MarshalAs(UnmanagedType.ByValTStr,SizeConst=32)] 
          public string dmDeviceName;
        public short  dmSpecVersion;
        public short  dmDriverVersion;
        ... 
}

You can have a look at the source code attached and apply this logic to any event that you want.

Be aware that, the types have the right size and that fixed length strings are appropriately defined. In this case WORD maps to short, DWORD to int and short stays as short.

C#
DEVMODE dm = new DEVMODE();
dm.dmDeviceName = new String (new char[32]);
dm.dmFormName = new String (new char[32]);
dm.dmSize = (short)Marshal.SizeOf (dm); 
 
if (0 != User32.EnumDisplaySettings (null, 
       User32.ENUM_CURRENT_SETTINGS, ref dm))
{

At this point the DEVMODE structure will be decorated with the default settings and can modify it at any instance.

C#
dm.dmPelsWidth = iWidth;
dm.dmPelsHeight = iHeight; 
 
int iRet = User32.ChangeDisplaySettings (
  ref dm, User32.CDS_UPDATEREGISTRY);

The enclosed code block does this a little differently to deal with various error conditions. I would encourage you to look at the full source file and see what it does. That's all there is to it.

How to Safeguard the User Screen Resolution

Finally, before we continue, it’s our responsibly to safeguard a user's default screen resolution. In order to do that, you might have to use some static members or classes to hold the user screen resolution and retain it back when you complete the execution.

See the downloads at the top of this article for the source code.

License

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


Written By
Software Developer (Senior) Freelance
India India
He is a certified professional in both MCPD and MCTS. He is a mathematics graduate with masters in computer science.He was born and bred in India and happen to spend some time in Europe.

Comments and Discussions

 
Questionthx Pin
Member 1433514526-Apr-19 10:13
Member 1433514526-Apr-19 10:13 
Questionway i get sometimes the 'default' section? Pin
Member 1236127214-May-17 0:31
Member 1236127214-May-17 0:31 
QuestionChanging Aspect Ratio Pin
John924129-Jul-16 5:51
John924129-Jul-16 5:51 
AnswerRe: Changing Aspect Ratio Pin
Member 1236127214-May-17 20:31
Member 1236127214-May-17 20:31 
QuestionHeight and Width confusing Pin
Michael B Pliam7-May-16 12:11
Michael B Pliam7-May-16 12:11 
The code I downloaded works but I am confused about the height and width instantiations.
C#
private int FixHeight = 1024, FixWidth = 768;

tempHeight = Srn.Bounds.Width;
tempWidth = Srn.Bounds.Height;

Normally one would expect the screen resolution width to be larger than the height. Further, the tempHeight uses Srn.Bounds.Width and vice versa.

In fact, in this article, it is shown as:
CSS
Screen screen = Screen.PrimaryScreen;
int S_width=screen.Bounds.Width;
int S_height=screen.Bounds.Height;

Is this intentional or an error? Or have I missed the point? I tried switching them around so that they make sense to me but when I do so the app cannot change the screen resolution and a 'failed' message appears.

modified 9-May-16 12:48pm.

QuestionAny resolution Pin
Computer Wiz9912-May-15 4:30
Computer Wiz9912-May-15 4:30 
QuestionError with windows 7 - resolution 1024 x 768 Pin
Member 123577420-Aug-14 8:54
Member 123577420-Aug-14 8:54 
AnswerRe: Error with windows 7 - resolution 1024 x 768 (resolved) Pin
Member 123577421-Aug-14 3:29
Member 123577421-Aug-14 3:29 
Questionthank's Pin
hoseinziba23-Mar-14 1:31
hoseinziba23-Mar-14 1:31 
QuestionSet screen reslolution Pin
Sasha Neftin4-Mar-14 19:35
Sasha Neftin4-Mar-14 19:35 
Questiondown Pin
little mantou10-Jul-12 22:50
little mantou10-Jul-12 22:50 
QuestionHigh Resolutions Pin
ahmed.helmy20418-Dec-11 3:17
ahmed.helmy20418-Dec-11 3:17 
QuestionCannot change resolution in Winlogon Screen Pin
sonali.mendis8-Sep-11 21:04
sonali.mendis8-Sep-11 21:04 
QuestionNice its helps me.. Pin
Pritesh Aryan25-Jul-11 21:01
Pritesh Aryan25-Jul-11 21:01 
GeneralMy vote of 5 Pin
Member 23125037-Jul-11 0:21
Member 23125037-Jul-11 0:21 
GeneralMy vote of 5 Pin
tomydragon5-Oct-10 21:52
tomydragon5-Oct-10 21:52 
GeneralDesktop doesn't follow new orientation on Windows 7 Pin
rapik212-Apr-09 2:24
rapik212-Apr-09 2:24 
GeneralDual Monitor Support Pin
Daniel N21-Apr-09 1:55
Daniel N21-Apr-09 1:55 
GeneralThanks for this usefull post Pin
Medoune9-Mar-09 4:40
Medoune9-Mar-09 4:40 
GeneralDynamic Screen Resoultion for Windows Mobile Pin
jayanice24-Feb-09 17:51
jayanice24-Feb-09 17:51 
Question1280x800 ?? Pin
ronaldo268920-Nov-08 12:28
ronaldo268920-Nov-08 12:28 
Generalconstant size of letters whatever the screen physical size Pin
pierre_lannion14-Sep-08 22:44
pierre_lannion14-Sep-08 22:44 
AnswerRe: constant size of letters whatever the screen physical size Pin
webatxcent15-Jan-09 8:18
webatxcent15-Jan-09 8:18 
Generalget available screen resolutions Pin
pravin parmar15-Oct-07 19:32
pravin parmar15-Oct-07 19:32 
GeneralRe: get available screen resolutions Pin
sreejith ss nair16-Oct-07 0:15
sreejith ss nair16-Oct-07 0:15 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.