2010-08-01 67 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字段回收垃圾,因此,如果我發現錯誤,我將不勝感激。