1

我正在尝试检索系统上存在的所有各种监视器(及其适配器)的信息。到目前为止,我使用EnumDisplayDevices列出所有监视器的尝试效果很好 - 它找到了两个,第一个是"\\.\DISPLAY1\Monitor0"(第二个分别只是 2 和 1,但这与这个问题无关)。无论如何,然后我尝试调用EnumDisplaySettingsEx它,如上所述传递监视器的名称,但它总是失败。带有空名称参数的调用成功,但DEVMODE返回的结构说dmDeviceName是“cdd”,我非常怀疑它是否准确。我究竟做错了什么?

哦,我已经尝试过使用EnumDisplaySettings(非 Ex 的),但它甚至不适用于 null name 参数。

P/Invoke 签名(Ex 对 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# 标签。

4

1 回答 1

1

我是个白痴,你应该将一个显示适配器传递给这个函数,而不是一个监视器。通过"\\.\DISPLAY1"就好了。

不过,我仍然在为该dmDeviceName领域回收垃圾,所以我很感激任何关于我是如何弄错的建议。

于 2010-08-02T01:13:38.947 回答