我正在尝试检索系统上存在的所有各种监视器(及其适配器)的信息。到目前为止,我尝试使用EnumDisplayDevices
列出所有显示器的效果很好 - 它找到了两个,第一个是"\\.\DISPLAY1\Monitor0"
(第二个只分别是2和1,但它与这个问题无关)。无论如何,我接着尝试在其上调用EnumDisplaySettingsEx
,传递监视器的名称,但总是失败。使用空名称参数的调用成功,但返回的DEVMODE
结构表示dmDeviceName
为“cdd”,我非常怀疑这是否准确。我做错了什么?
哦,我已经尝试使用EnumDisplaySettings
(非Ex),而且甚至不能使用null name参数。
P / Invoke签名(Ex's稍微修改了pinvoke.net上的一个,试图让它起作用):
[DllImport("user32.dll")]
public static extern bool EnumDisplaySettings(string deviceName, int modeNum, ref DEVMODE devMode);
[DllImport("user32.dll", CharSet = CharSet.Ansi)]
public static extern bool EnumDisplaySettingsEx([MarshalAs(UnmanagedType.LPStr)]string lpszDeviceName, int iModeNum, ref DEVMODE lpDevMode, EdsDwFlags dwFlags);
DEVMODE
定义在http://www.pinvoke.net/default.aspx/Structures/DEVMODE.html。 EdsDwFlags
目前始终为零。 iModeNum
为-1(对于当前设置)。
由于某种原因,StackOveflow不允许我在此帖子中附加C#标签。
答案 0 :(得分:1)
我是个白痴,你应该将显示适配器传递给这个功能,而不是显示器。仅通过"\\.\DISPLAY1"
工作正常。
尽管如此,我仍然会为dmDeviceName
字段收回垃圾回复,所以我很欣赏任何有关我如何做错的建议。