2010-08-01 73 views
1

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

哦,我试过使用EnumDisplaySettings(非Ex实例),它甚至没有使用空名称参数。

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

DEVMODEhttp://www.pinvoke.net/default.aspx/Structures/DEVMODE.html定义。现在的EdsDwFlags始终为零。 iModeNum是-1(用于当前设置)。

由于某种原因StackOveflow不会让我附加一个C#标签到这篇文章。

回答

1

我是个白痴,你应该到显示适配器传递给这个函数,而不是一个显示器。传球只是"\\.\DISPLAY1"工作正常。

尽管如此,我仍然在为dmDeviceName字段回收垃圾,因此,如果我发现错误,我将不胜感激。