【问题标题】:Enable a disabled screen using ChangeDisplaySettingsEx使用 ChangeDisplaySettingsEx 启用禁用的屏幕
【发布时间】:2020-08-09 06:16:01
【问题描述】:

我正在使用 WinAPI ChangeDisplaySettingsEx 来切换我的 Windows 10 屏幕配置。
屏幕多于两个,所以 ScreenSwitch.exe 对我来说不够用。

我引用了这个:

https://www.codeproject.com/Articles/178027/How-to-create-a-display-switcher-for-Windows-XP?msg=3850767#xx3850767xx

并成功禁用了这些代码中的屏幕:

string displayName = @"\\.\DISPLAY3";
DEVMODE devMode= new DEVMODE();
devMode.dmPosition.x = 0;
devMode.dmPosition.y = 0;
devMode.dmPelsWidth = 0;
devMode.dmPelsHeight = 0;
devMode.dmFields = DEVMODE_Flags.DM_PELSHEIGHT | DEVMODE_Flags.DM_PELSWIDTH | DEVMODE_Flags.DM_POSITION;
devMode.dmSize = (ushort)Marshal.SizeOf(devMode);
ChangeDisplaySettingsEx(displayName, ref devMode, IntPtr.Zero, (int)(DeviceFlags.CDS_RESET | DeviceFlags.CDS_UPDATEREGISTRY), IntPtr.Zero);

但我无法启用屏幕:

...
devMode.dmPosition.x = -3840;
devMode.dmPosition.y = -1059;
devMode.dmPelsWidth = 3840;
devMode.dmPelsHeight = 2160;
...

ChangeDisplaySettingsEx 得到 -1 结果意味着 CHANGE_FAILED

我猜该屏幕已禁用,因此启用它需要更多信息吗?

我尝试在启用屏幕时保存 DEVMODE,并在禁用屏幕时将其发送到 ChangeDisplaySettingsEx。不工作。

感谢您的任何建议

【问题讨论】:

  • 试试:ChangeDisplaySettingsEx(displayName, ref devMode, IntPtr.Zero, (int)(DeviceFlags.CDS_NORESET | DeviceFlags.CDS_UPDATEREGISTRY), IntPtr.Zero); ChangeDisplaySettingsEx(IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero); 告诉我它是否有用。

标签: c# windows winapi monitor


【解决方案1】:

感谢 Strive Sun 的回答。
这行得通。

我不能直接启用我的“\.\DISPLAY3”,
我的“Screen2”将首先激活,尽管参数是“Screen3”。
但它可以轻松解决,如下所示:

enableScreen(2);
enableScreen(3);
disableScreen(2);



我还尝试使用 EnumDisplayDevices 来获取我的显示器的设备名称。
我得到了“\.\DISPLAY3\Monitor0”。

但它会在 ChangeDisplaySettingsEx 中失败,得到 -5 结果(意味着 BAD_PARAM)。

【讨论】:

  • 很高兴为您提供帮助。您可以标记您的答案以结束此线程。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-06-19
  • 2014-06-05
  • 2017-04-19
  • 1970-01-01
  • 2020-01-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多