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

时间:2008-10-24 12:55:48

标签: c# winforms desktop multiple-monitors

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

alt text

5 个答案:

答案 0 :(得分:13)

MSDN Device Context Functions

您基本上需要做的事情:

  

使用EnumDisplayDevices()API调用   枚举显示设备   系统并寻找那些   没有   DISPLAY_DEVICE_ATTACHED_TO_DESKTOP   标志集(这将包括任何   镜像设备所以不是全部   物理显示。)一旦你找到了   你需要得到的显示设备   一个有效的显示模式,将其更改为,   你可以通过拨打电话找到   EnumDisplaySettingsEx()API调用 -   通常你会显示所有   可用模式并允许用户使用   但是在你的情况下选择它听起来   像这样可能是硬编码   并为您节省额外的一步。对于   为了将来证明你的未来   应用虽然我建议有   这很容易改变而没有   每次挖掘源头,   注册表项是显而易见的   选择。一旦你排序了   out填充DevMode显示   结构与信息有关   显示器定位(设置   PelsWidth / Height,Position,   DisplayFrequency和BitsPerPel   属性)然后设置这些标志   领域成员。最后打电话   ChangeDisplaySettingsEx()用这个   设置结构,一定要发送   重置和更新注册表标志。   这应该就是你所需要的,希望如此   帮助,

使用PInvoke

导入

DISPLAY_DEVICE结构

EnumDisplayDevices功能导入

EnumDisplaySettingsEx功能导入

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

答案 1 :(得分:11)

如果你有Windows 7,那么就开始一个过程:

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

然后DisplayChanger.Start();

答案 2 :(得分:2)

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

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

答案 3 :(得分: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());

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

答案 4 :(得分: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);