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

问题描述 投票:19回答:5

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

c# winforms desktop multiple-monitors
5个回答
13
投票

MSDN Device Context Functions

你基本上需要做什么:

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

使用PInvoke进行DISPLAY_DEVICE结构导入

EnumDisplayDevices功能导入

EnumDisplaySettingsEx功能导入

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


11
投票

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

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

然后DisplayChanger.Start();


2
投票

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

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


1
投票

我正在寻找相同的解决方案。我编写了以下代码来使用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());

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


1
投票

要启用监视器,请将其位置设置为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);
© www.soinside.com 2019 - 2024. All rights reserved.