如何在C#中启用第二台显示器?

是否可以以编程方式启用第二个监视器并使用C#将Windows桌面扩展到它上面? 它需要相当于打开下图中的复选框。

替代文字http://sofzh.miximages.com/c%23/27y8nt5.png

MSDN设备上下文function

你基本上需要做什么:

使用EnumDisplayDevices()API调用枚举系统上的显示设备,并查找那些没有设置DISPLAY_DEVICE_ATTACHED_TO_DESKTOP标志的设备(这将包括所有镜像设备,因此并非所有设备都是物理显示器。)一旦找到了显示设备你需要获得一个有效的显示模式来改变它,你可以通过调用EnumDisplaySettingsEx()API调用找到它 – 通常你会显示所有可用的模式,并允许用户选择在你的情况下它这样的声音可能会硬编码并为您节省额外的一步。 为了使您的应用程序能够面向未来,虽然我建议您可以轻松更改这些内容,而无需每次都仔细查看源代码,但注册表项将是明显的选择。 一旦你完成整理后,填充一个DevMode显示结构,其中包含有关显示位置的信息(设置PelsWidth / Height,Position,DisplayFrequency和BitsPerPel属性),然后在fields成员中设置这些标志。 最后使用此设置结构调用ChangeDisplaySettingsEx(),并确保发送重置和更新注册表标志。 那应该就是你所需要的,希望这会有所帮助,

使用PInvoke导入DISPLAY_DEVICE结构

EnumDisplayDevices函数导入

EnumDisplaySettingsEx函数导入

其他function可以通过简单的名称搜索找到。

如果您有Windows 7,那么只需启动一个过程:

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

然后DisplayChanger.Start();

我在这里没有完整的答案,但我几乎可以肯定你必须打电话给.Net才能做到这一点。 您将不得不使用Pinvoke来调用非托管dll。 pinvoke.net是一个很好的资源。

我做了一个快速搜索,发现http://www.pinvoke.net/default.aspx/user32/ChangeDisplaySettings.html这可能不是你想要的,但你可能会在pinvoke.net上找到它

我正在寻找相同的解决方案。 我编写了以下代码来使用PInvoke调用ChangeDisplaySettingsEx

 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()); 

如果已启用监视器,则会成功更改分辨率。 但是,如果显示器尚未连接到桌面,则不会激活它。 那么有没有人有一个有效的代码示例?

要启用监视器,请将其位置设置为0,0以外的其他值,如下所示:

 POINTL enabledPosition = new POINTL(); enabledPosition.x = -1280; enabledPosition.y = 0; dm.dmPosition = enabledPosition; dm.dmFields = DM.Position; res = ChangeDisplaySettingsEx(d.DeviceName, ref dm, IntPtr.Zero, (uint) DeviceFlags.CDS_UPDATEREGISTRY, IntPtr.Zero);