Winapi p/invoke和EnumDisplaySettingsEx的困难

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

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

哦,我试过使用
EnumDisplaySettings
(非Ex设置),但对于null name参数甚至都不起作用

p/Invoke签名(Ex在pinvoke.net上做了一点修改,试图让它正常工作):

DEVMODE
在中定义<代码>EdsDwFlags目前始终为零<代码>iModeNum为-1(对于当前设置)


出于某种原因,StackOveflow不允许我在这篇文章上附加C标签。

我是个白痴,你应该给这个函数传递一个显示适配器,而不是一个监视器。只需传递
“\\。\DISPLAY1”
就可以了


尽管如此,我仍然会收到
dmDeviceName
字段的垃圾,因此我非常感谢任何关于我是如何出错的建议。

我是个白痴,你应该向这个函数传递显示适配器,而不是监视器。只需传递
“\\。\DISPLAY1”
就可以了

尽管如此,我仍然在为
dmDeviceName
字段回收垃圾,因此我希望您能给我一些关于我是如何出错的建议

[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);