代码之家  ›  专栏  ›  技术社区  ›  Matt Warren

如何在C中启用第二个监视器?

  •  19
  • Matt Warren  · 技术社区  · 16 年前

    是否可以通过编程启用第二个监视器,并在C中将Windows桌面扩展到该监视器上?它需要等效于打开下面图像中的复选框。

    alt text

    5 回复  |  直到 5 年前
        1
  •  13
  •   Pop Catalin    16 年前

    MSDN Device Context Functions

    你基本上需要做的是:

    使用EnumDisplayDevices()API调用 枚举上的显示设备 系统和寻找那些 不要拥有 DISPLAY_DEVICE_ATTACHED_TO_DESKTOP 标志集(这将包括 镜像设备,因此并非所有设备 物理显示。)一旦找到 你需要的显示设备 将其更改为的有效显示模式, 您可以通过拨打 EnumDisplaySettingsEx()API调用- 一般来说,你会显示所有 可用模式并允许用户 但在你的案例中选择它听起来 像这样可能会硬编码 并为您节省一个额外的步骤。为了 为了将来证明你 尽管我建议你 这很容易改变而没有 每次都要从源头挖掘, 注册表项是显而易见的 选择。一旦你把它整理好了 输出填充devmode显示 结构中包含有关 显示位置(设置 Pelswidth/高度,位置, 显示频率和位 属性),然后在 字段成员。最后呼叫 changeDisplaySettingsEx()使用此 设置结构并确保发送 重置和更新注册表标志。 这就是你所需要的,希望如此 帮助,

    DISPLAY_DEVICE 使用PInvoke导入结构

    EnumDisplayDevices 函数导入

    EnumDisplaySettingsEx 函数导入

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

        2
  •  11
  •   Robert Baker    14 年前

    如果您有Windows 7,则只需启动一个进程:

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

    然后显示changer.start();

        3
  •  2
  •   Timbo    16 年前

    我这里没有完整的答案,但我几乎可以肯定您必须从.NET中调用才能完成此操作。您必须使用pinvoke来调用非托管的dll。一个很好的资源是pinvoke.net。

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

        4
  •  1
  •   tradel    15 年前

    我正在寻找同样的解决方案。我写了以下代码来调用 ChangeDisplaySettingsEx 与PInvoke:

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

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

        5
  •  1
  •   takrl Ganesan SubbiahPandian    13 年前

    要启用监视器,请将其位置设置为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);