我怎样才能暂时空白一个Windows 7的第二显示器,在C#中?

我尝试使用ChangeDisplaySettingsEx设置它的宽度和高度为0,这使显示监视器变为空白,但是当我将W和H设置回(还恢复了dmPosition.x)时,它就保持closures。

我的系统有两个显示器,我试图暂时将其中一个显示为空白。 之后,我需要把它重新打开。

这是代码……………..

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. <<<<<<<<<<<<<<"); } } 

这是我找到并成功使用的解决方案……

  [DllImport("user32.dll")] static extern IntPtr SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, IntPtr lParam); private const int WM_SYSCOMMAND = 0x0112; private const int SC_MONITORPOWER = 0xF170; private const int MonitorTurnOn = -1; private const int MonitorShutoff = 2; //Turn them off public static void turn_off_monitors() { Form f = new Form(); SendMessage(f.Handle, WM_SYSCOMMAND, (IntPtr)SC_MONITORPOWER, (IntPtr)MonitorShutoff); } //Turn them on public static void turn_on_monitors() { Form f = new Form(); SendMessage(f.Handle, WM_SYSCOMMAND, (IntPtr)SC_MONITORPOWER, (IntPtr)MonitorTurnOn); } 

您可以使用DisplaySwitch应用程序来执行此操作:

 String cmd = "DisplaySwitch"; String argument = "/internal"; System.Diagnostics.Process.Start(cmd, argument); 

如果你想要另一台显示器,请使用:

 String argument = "/external"; 

检索双屏幕:

 String argument = "/extend";