是否可以以编程方式启用第二台显示器并使用C#将Windows桌面扩展到其上?它需要相当于打开下图中的复选框。
答案 0 :(得分:13)
您基本上需要做的事情:
使用PInvoke 导入使用EnumDisplayDevices()API调用 枚举显示设备 系统并寻找那些 没有
DISPLAY_DEVICE_ATTACHED_TO_DESKTOP
标志集(这将包括任何 镜像设备所以不是全部 物理显示。)一旦你找到了 你需要得到的显示设备 一个有效的显示模式,将其更改为, 你可以通过拨打电话找到 EnumDisplaySettingsEx()API调用 - 通常你会显示所有 可用模式并允许用户使用 但是在你的情况下选择它听起来 像这样可能是硬编码 并为您节省额外的一步。对于 为了将来证明你的未来 应用虽然我建议有 这很容易改变而没有 每次挖掘源头, 注册表项是显而易见的 选择。一旦你排序了 out填充DevMode显示 结构与信息有关 显示器定位(设置 PelsWidth / Height,Position, DisplayFrequency和BitsPerPel 属性)然后设置这些标志 领域成员。最后打电话 ChangeDisplaySettingsEx()用这个 设置结构,一定要发送 重置和更新注册表标志。 这应该就是你所需要的,希望如此 帮助,
等。其余的功能可以通过简单的名称搜索找到。
答案 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);