p / invoke和EnumDisplaySettingsEx的困难

时间:2010-08-01 22:18:07

标签: winapi pinvoke user32

我正在尝试检索系统上存在的所有各种监视器(及其适配器)的信息。到目前为止,我尝试使用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.htmlEdsDwFlags目前始终为零。 iModeNum为-1(对于当前设置)。

由于某种原因,StackOveflow不允许我在此帖子中附加C#标签。

1 个答案:

答案 0 :(得分:1)

我是个白痴,你应该将显示适配器传递给这个功能,而不是显示器。仅通过"\\.\DISPLAY1"工作正常。

尽管如此,我仍然会为dmDeviceName字段收回垃圾回复,所以我很欣赏任何有关我如何做错的建议。