我希望能够通过代码设置"将我的Windows桌面扩展到此监视器上".PowerShell脚本是理想的.WMI似乎是前进的方向,但我对WMI知之甚少.
Windows 7,8和10应该带有一个小程序,它可以完成这个:displayswitch.exe. 此页面列出了以下参数:
displayswitch.exe/internal Disconnect projector displayswitch.exe/clone Duplicate screen displayswitch.exe/extend Extend screen displayswitch.exe/external Projector only (disconnect local)
对于提出的问题的一键式解决方案,只需创建一个包含单行的*.bat文件
call displayswitch.exe/extend
并将其保存到您的桌面.
[我在Windows 8.1上对此进行了测试,并且已经确认可以在Windows 10上运行.]
我制作了一个不使用sendkey的更干净的版本。
public class DisplayHelper { [DllImport("user32.dll")] static extern DISP_CHANGE ChangeDisplaySettings(uint lpDevMode, uint dwflags); [DllImport("user32.dll")] static extern bool EnumDisplayDevices(string lpDevice, uint iDevNum, ref DISPLAY_DEVICE lpDisplayDevice, uint dwFlags); enum DISP_CHANGE : int { Successful = 0, Restart = 1, Failed = -1, BadMode = -2, NotUpdated = -3, BadFlags = -4, BadParam = -5, BadDualView = -1 } [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)] struct DISPLAY_DEVICE { [MarshalAs(UnmanagedType.U4)] public int cb; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)] public string DeviceName; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)] public string DeviceString; [MarshalAs(UnmanagedType.U4)] public DisplayDeviceStateFlags StateFlags; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)] public string DeviceID; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)] public string DeviceKey; } [Flags()] enum DisplayDeviceStateFlags : int { ///The device is part of the desktop. AttachedToDesktop = 0x1, MultiDriver = 0x2, ///The device is part of the desktop. PrimaryDevice = 0x4, ///Represents a pseudo device used to mirror application drawing for remoting or other purposes. MirroringDriver = 0x8, ///The device is VGA compatible. VGACompatible = 0x16, ///The device is removable; it cannot be the primary display. Removable = 0x20, ///The device has more display modes than its output devices support. ModesPruned = 0x8000000, Remote = 0x4000000, Disconnect = 0x2000000 } public static void EnableSecondaryDisplay() { var secondaryIndex = 1; var secondary = GetDisplayDevice(secondaryIndex); var id = secondary.DeviceKey.Split('\\')[7]; using (var key = Registry.CurrentConfig.OpenSubKey(string.Format(@"System\CurrentControlSet\Control\VIDEO\{0}", id), true)) { using (var subkey = key.CreateSubKey("000" + secondaryIndex)) { subkey.SetValue("Attach.ToDesktop", 1, RegistryValueKind.DWord); subkey.SetValue("Attach.RelativeX", 1024, RegistryValueKind.DWord); subkey.SetValue("DefaultSettings.XResolution", 1024, RegistryValueKind.DWord); subkey.SetValue("DefaultSettings.YResolution", 768, RegistryValueKind.DWord); subkey.SetValue("DefaultSettings.BitsPerPel", 32, RegistryValueKind.DWord); } } ChangeDisplaySettings(0, 0); } private static DISPLAY_DEVICE GetDisplayDevice(int id) { var d = new DISPLAY_DEVICE(); d.cb = Marshal.SizeOf(d); if (!EnumDisplayDevices(null, (uint)id, ref d, 0)) throw new NotSupportedException("Could not find a monitor with id " + id); return d; } }
我仅在新安装的计算机上对此进行了测试。