none
how can I temporarily blank a Windows-7 2nd display monitor?

    Question

  • I try setting its width and height to 0 using ChangeDisplaySettingsEx, which blanks the display monitor, but then when I set W and H back (and also restore dmPosition.x) it just stays off.

    My system has two monitors, and I'm trying to temporarily blank one of them.  Later, I need to turn it back on.

    HERE'S THE CODE...............

    		public static void set_monitor_settings( int devNum, bool monitor_on_off ) 
    		{
    			if( monitor_on_off )
    				Console.WriteLine("TURN ON ULTRASOUND MONITOR");
    			else
    				Console.WriteLine("TURN OFF ULTRASOUND MONITOR");
    			// Init:
    				DISPLAY_DEVICE lpDisplayDevice = new DISPLAY_DEVICE(0);		// OUT
    				DISPLAY_DEVICE monitor_name = new DISPLAY_DEVICE(0);		// OUT
    				DEVMODE display_setting = new DEVMODE();
    				lpDisplayDevice.cb = Marshal.SizeOf(lpDisplayDevice);
    				display_setting.dmSize = (ushort)Marshal.SizeOf(display_setting);
    			// Set lpDisplayDevice to select 2nd display device:
    				EnumDisplayDevices(null, devNum, ref lpDisplayDevice, 0);
    					Console.WriteLine("\ndevNum =" + devNum);
    					Console.WriteLine("cb =" + lpDisplayDevice.cb);
    					Console.WriteLine("DeviceID =" + lpDisplayDevice.DeviceID);
    					Console.WriteLine("DeviceKey =" + lpDisplayDevice.DeviceKey);
    					Console.WriteLine("DeviceName =" + lpDisplayDevice.DeviceName.Trim());
    					Console.WriteLine("DeviceString =" + lpDisplayDevice.DeviceString.Trim());
    			// Open settings of 2nd device:
    			int return_value;
    			if( monitor_on_off )
    			{
    				return_value = EnumDisplaySettings(lpDisplayDevice.DeviceName,
    						0,  //ENUM_CURRENT_SETTINGS,											///////<<<<<<<<< might need to be 0
    						ref display_setting) ;
    			}
    			else
    			{
    				return_value = EnumDisplaySettings(lpDisplayDevice.DeviceName,
    						ENUM_CURRENT_SETTINGS,											///////<<<<<<<<< might need to be 0
    						ref display_setting);
    			}
    			if(return_value > 0)// Succeeded
    			{
    				Console.WriteLine("Current Mode:\n\t" +
    					"{0}w by {1}h, " +
    					"{2} bit, " +
    					"{3} degrees, " +
    					"{4} hertz",
    					display_setting.dmPelsWidth,
    					display_setting.dmPelsHeight,
    					display_setting.dmBitsPerPel,
    					display_setting.dmDisplayOrientation * 90,
    					display_setting.dmDisplayFrequency);
    				//Console.WriteLine(display_setting.dmDisplayOrientation + "\t = Raw orientation");
    				display_setting.dmDisplayOrientation = 0;   // set landscape orientation to landscape
    				//display_setting.dmDisplayOrientation = 2;   // set landscape orientation to landscape upside down
    				if (monitor_on_off)
    				{
    					// Set resolution to G4.1 (April 2013) requirement:
    					display_setting.dmPelsWidth = 1280;
    					display_setting.dmPelsHeight = 1024;
    					display_setting.dmPosition.x = 1200;
    				}
    				else
    				{
    					display_setting.dmPelsWidth = 0;
    					display_setting.dmPelsHeight = 0;
    					
    				}
    				int iRet = ChangeDisplaySettingsEx(lpDisplayDevice.DeviceName, ref display_setting, IntPtr.Zero, CDS_UPDATEREGISTRY, IntPtr.Zero);
    				if (iRet == 0)
    					Console.WriteLine("SUCCESSFUL");
    				else
    					Console.WriteLine(iRet + "\t = ChangeDisplaySettingsEx return value ");
    			}
    			else
    			{
    				Console.WriteLine(">>>  EnumDisplaySettings  RETURNED 0.  <<<<<<<<<<<<<<");
    			}
    		}


    software developer

    Thursday, May 02, 2013 4:06 PM

All replies

  • Sounds like what SetDisplayConfig is designed to do. It seems the display control panel applet calls it a lot of times (probably some trial and error) before settling on a screen topology. But I think you don't need to try and validate - just backup the screen topology returned by QueryDisplayConfig when you choose "Extend" and when you choose "Show monitor only on x", they apply a desired screen topology when needed.


    Visual C++ MVP

    Friday, May 03, 2013 7:01 PM