Трудности с p / invoke и EnumDisplaySettingsEx - PullRequest
1 голос
/ 02 августа 2010

Я пытаюсь получить информацию обо всех различных мониторах (и их адаптерах), имеющихся в системе.До сих пор мои попытки использовать EnumDisplayDevices для перечисления всех мониторов работали замечательно - было найдено два, первое - "\\.\DISPLAY1\Monitor0" (второе - только 2 и 1 соответственно, но это не имеет отношения к этому вопросу).Во всяком случае, я тогда попытался вызвать EnumDisplaySettingsEx на нем, передавая имя монитора, как указано выше, но он всегда терпит неудачу.Вызовы с параметром нулевого имени успешны, но возвращенная структура DEVMODE говорит, что dmDeviceName - это "cdd", что, я сильно сомневаюсь, является точным.Что я делаю не так?

О, и я пытался использовать EnumDisplaySettings (не Ex), и это даже не работает с параметром нулевого имени.

P/ Вызывать подписи (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 # к этому сообщению.

1 Ответ

1 голос
/ 02 августа 2010

Я идиот, вы должны передать этой функции адаптер дисплея , а не монитор .Передача только "\\.\DISPLAY1" работала нормально.

Я все еще получаю мусор для поля dmDeviceName, поэтому я буду признателен за любые предложения относительно того, как я понял это неправильно.

...