views:

3676

answers:

6
+2  A: 

I don't have the full answer here but I am almost sure that you will have to call out of .Net to do this. You will have to use Pinvoke to call an unmanaged dll. A great resource for this is pinvoke.net.

I did a quick search and found http://www.pinvoke.net/default.aspx/user32/ChangeDisplaySettings.html which probably isn't exactly what you want but you will probably find it somewhere on pinvoke.net

Timbo
+7  A: 

MSDN Device Context Functions

What you basically need to do:

Use the EnumDisplayDevices() API call to enumerate the display devices on the system and look for those that don't have the DISPLAY_DEVICE_ATTACHED_TO_DESKTOP flag set (this will include any mirroring devices so not all will be physical displays.) Once you've found the display device you'll need to get a valid display mode to change it to, you can find this by calling the EnumDisplaySettingsEx() API call - Generally you'd display all the available modes and allow the user to choose however in your case it sounds like this may be possible to hard-code and save you an additional step. For the sake of future-proofing your application though I'd suggest having this easily changeable without having to dig through the source every time, a registry key would be the obvious choice. Once you've got that sorted out populate a DevMode display structure with the information about the display positioning (set the PelsWidth/Height, Position, DisplayFrequency and BitsPerPel properties) then set these flags in the fields member. Finally call ChangeDisplaySettingsEx() with this settings structure and be sure to send the reset and update registry flags. That should be all you need, hope this helps,

DISPLAY_DEVICE structure import using PInvoke

EnumDisplayDevices function import

EnumDisplaySettingsEx function import

etc. the rest of them functions can be found with a simple search by name.

Pop Catalin
Hi Pop, I can use your method if the secondary monitor is already enabled, but I can't use it to turn on the secondary method, it always fails. Should this method be able to do this?
Matt Warren
This could be a driver specific issue, the driver doesn't automatically enable a monitor when the api sets's some valid monitor settings. In my case I was working with some old Matrox card, and I didn't have this issue. It might be useful to look up some specific manufacturer docs.
Pop Catalin
Or better yet, ask the question on MSDN driver development forums :)
Pop Catalin
A: 

I am looking for the same solution. I have written the following code to call ChangeDisplaySettingsEx with PInvoke:

DEVMODE dm = new DEVMODE();
dm.dmSize = (short)Marshal.SizeOf(dm);
dm.dmPelsWidth = 1680;
dm.dmPelsHeight = 1050;
dm.dmBitsPerPel = 32;
dm.dmDisplayFrequency = 60;
dm.dmFields = DevModeFields.DM_BITSPERPEL | DevModeFields.DM_PELSWIDTH | 
              DevModeFields.DM_PELSHEIGHT | DevModeFields.DM_DISPLAYFREQUENCY;
int res = ChangeDisplaySettingsEx(@"\\.\DISPLAY2", ref dm, IntPtr.Zero, CDS_RESET | CDS_UPDATEREGISTRY, IntPtr.Zero);
Console.WriteLine("result = " + res.ToString());

If the monitor is already enabled, this changes the resolution successfully. But if the monitor isn't attached to the desktop already, this won't activate it. So does anyone have a code example that works?

A: 

hey Guys,

I am working my ass of but without any success ...

I hope someone of you found a solution and will post it here :)

would be nice !

thx n greets

Nick

Nick
A: 

hi, Had you finally found an answer ?

thanx

Olivier SOW
A: 

If you have windows 7, then just start a process:

    private static Process DisplayChanger = new Process
    {
        StartInfo =
        {
            CreateNoWindow = true,
            WindowStyle = ProcessWindowStyle.Hidden,
            FileName = "DisplaySwitch.exe",
            Arguments = "/extend"
        }
    };

then DisplayChanger.Start();

sevenalive