Управление мониторами из командной строки
-
- Клубмен
- Сообщения: 3253
- Зарегистрирован: 08.10.2003 0:15
- Откуда: МИРовой Клуб
- Контактная информация:
Управление мониторами из командной строки
Собственно сабж.
Есть задача:
На работе и дома теперь двухмониторные конфигурации.
На работе основным дисплеем должна быть панель ноута, а внешний LCD вторичным.
Дома наоборот: основной дисплей -- внешний, а панель ноута вторичная.
Для nvidia командная сторока для переключения мониторов известна:
rundll32.exe NvCpl.dll,dtcfg primary [Х]
где Х -- это номер монитора.
Да и API NvCpl.dll описано в PDF
А вот какая это строка для ATI, и вообще есть в этом направлении у кого-нибудь наработки?
Есть задача:
На работе и дома теперь двухмониторные конфигурации.
На работе основным дисплеем должна быть панель ноута, а внешний LCD вторичным.
Дома наоборот: основной дисплей -- внешний, а панель ноута вторичная.
Для nvidia командная сторока для переключения мониторов известна:
rundll32.exe NvCpl.dll,dtcfg primary [Х]
где Х -- это номер монитора.
Да и API NvCpl.dll описано в PDF
А вот какая это строка для ATI, и вообще есть в этом направлении у кого-нибудь наработки?
-
- Администратор Judge Dredd
- Сообщения: 17062
- Зарегистрирован: 17.01.2003 11:52
- Контактная информация:
AMD предлагают драйвер писать http://developer.amd.com/documentation/ ... x#open_gpu . RivaTuner позволяет писать в регистры GPU, правда, Unwinder эту функцию спрятал, но при личном обращении может и раскрыть. Так что узнав из документации нужные значения регистров, теоретически возможно конфигурировать GPU минуя штатный драйвер, правда, как Windows будет узнавать об изменениях - непонятно.
Угу, вот только в Vista нет этого API. Да и дока 2005 года.API NvCpl.dll описано в PDF
-
- Участник
- Сообщения: 532
- Зарегистрирован: 06.06.2005 3:29
- Откуда: Недалеко от Киева
- Контактная информация:
-
- Участник
- Сообщения: 532
- Зарегистрирован: 06.06.2005 3:29
- Откуда: Недалеко от Киева
- Контактная информация:
-
- Участник
- Сообщения: 532
- Зарегистрирован: 06.06.2005 3:29
- Откуда: Недалеко от Киева
- Контактная информация:
DrEvil, блин. Давно не загядывал в этот раздел, а форум слишком быстрый, проглядел ровно на месяц. Мне в общем-то все равно, но в данном конкретном случае требуется согласие господина JaJa. Если он разрешает, то я могу предоставить сею утилиту и руководство по ее использованию совершенно бесплатно.
-
- Участник
- Сообщения: 532
- Зарегистрирован: 06.06.2005 3:29
- Откуда: Недалеко от Киева
- Контактная информация:
JaJa, это вы так говорите. Мне, как вольнонаемному программисту, попадались разные заказчики. Поэтому я стараюсь быть максимально осторожным в таких вопросах.
DrEvil, сама программа лежит тут: http://home.mikelab.kiev.ua/PROGRAMS/dispdeal.rar
А вот то, что я писал по ее использованию:
============================================================
Программа коммандной строки. Краткую справку выдает при запуске без параметров. В качестве идентификаторов мониторов используются имена, которые можно узнать запустив программу с ключиком /List. В качестве имени устройства допускается указание как полного имени \\.\DISPLAY2, так и сокращенного DISPLAY2, кроме того допкускается указание просто номера 2.
В одном вызове может быть сколько угодно секций /Mode (изменение режима), /Move (изменение позиции монитора), /Detach (отключение монитора) и /Realign (сброс вторичного монитора). Остальные секции засчитываются только при первом вхождении.
Указание режима при помощи /Mode возможно двумя путями. С указанием индекса режима:
Таким образом строка полного переключения первичного монитора выглядит так (три разных варианта):
Это все основные ключи. Теперь немного о неочевидных ньюансах. Каждая изменяющаяя настройки секция имеет три дополнительных необязательных двоичных параметра Save, Global, Apply:
Параметр Global допустим только при наличии параметра Save и обозначает сохранение новых настроек для всех пользователей системы.
Параметр Apply имеет смысл только при наличии параметра Save и обозначает необходимость немедленного применения измененных настроек (при отсутствии Save изменения применяются сразу).
Следует иметь в виду, что при множественных изменениях настроек делать немедленное применение каждой измененной настройки не только нецелесообразно, но и вредно по той причине, что могут возникнуть конфликты. Например следующая попытка поменять местами мониторы DISPLAY2 с координатами (1280,0) и DISPLAY3 с координатами (2560,0) ни приведет ни к чему хорошему:
Все ключи и параметры нечувствительны к регистру, порядок ключей и параметров тоже не важен. Все эти строки равнозначны:
============================================================
Что касается "острых углов", то ИМХО в программе таковых нет. Любой умеющий работать с коммандной строкой человек без проблем разберется. Если же будут найдены ошибки, то я готов по мере возможности исправлять их.
DrEvil, сама программа лежит тут: http://home.mikelab.kiev.ua/PROGRAMS/dispdeal.rar
А вот то, что я писал по ее использованию:
============================================================
Программа коммандной строки. Краткую справку выдает при запуске без параметров. В качестве идентификаторов мониторов используются имена, которые можно узнать запустив программу с ключиком /List. В качестве имени устройства допускается указание как полного имени \\.\DISPLAY2, так и сокращенного DISPLAY2, кроме того допкускается указание просто номера 2.
В одном вызове может быть сколько угодно секций /Mode (изменение режима), /Move (изменение позиции монитора), /Detach (отключение монитора) и /Realign (сброс вторичного монитора). Остальные секции засчитываются только при первом вхождении.
Указание режима при помощи /Mode возможно двумя путями. С указанием индекса режима:
Значения индексов всех доступных для монитора видеорежимов можно узнать при момощи ключа /Modes:/Mode:"Device=1 Index=150"
Также можно задавать режим поэлементно. При этом не нужно указывать все элементы, достаточно только тех, которые вас интересуют. Например если нужно изменить только глубину цвета, то кроме собственно устройства указываем только этот параметр:/Modes:"Device=1"
При этом остальные параметры по возможности будут сохранены (это зависит от того, является ли допустимой измененная конфигурация). То же самое в определенной степени касается и разрешения, в ряде случаев оказывается достаточно указания только одного измерения:/Mode:"Device=1 BPP=16"
Первичный монитор назначается при помощи ключа /Primary:/Mode:"Device=1 Width=1024"
При изменении первичного монитора производится та же последовательнось действий, что и при изменении средствами настроек экрана. После изменения первичного экрана может потребоваться коррекция позиции мониторов на рабочем столе и сброс вторичного монитора при помощи ключей /Move и /Realign:/Primary:"Device=1"
Ключ /Realign выполняет рекомендованную майкрософтом последовательность действий после смены первичного монитора. Но т.к. сообщение об отключении монитора до программ доходит не мгновенно, нужно выдержать некоторую паузу, в течении которой оболочка убедится что данный монитор действительно больше не первичный и переползет на другой. Размер паузы (в миллисекундах) указывается в необязательном параметре Relax, и по-умолчанию равен 1000 (одна секунда), это значение следует увеличить, если перемещение панели задач не происходит. Ключ /Realign имеет два варианта вызова. Без указания устройства происходит последовательный сброс всех вторичных мониторов:/Move:"Device=1 X=1280 Y=0"
Если же явно указать бывшее первичное, а ныне вторичное устройство, то произойдет только его сброс (рекомендую делать именно так):/Realign
/Realign:"Relax=2000"
Перед обработкой ключа /Realign всегда происходит применение изменений (т.е. выполняется неявный вызов обработчика ключа /Apply). Однако в зависимости от тонкостей драйверов, также может быть необходимыи отдельное окончательное применение настроек ключем /Apply./Realign:"Device=1 Relax=2000"
Таким образом строка полного переключения первичного монитора выглядит так (три разных варианта):
Кроме того, есть еще один ключ: /Detach. Этот ключ позволяет отключить заданное устройство от рабочего стола:/Primary:"Device=2 Save" /Realign:"Device=1 Relax=2000" /Apply
/Primary:"Device=2 Save" /Realign:"Relax=2000" /Apply
/Primary:"Device=2 Save" /Realign /Apply
Подключить отключенное устройство можно вызовом ключа /Move, просто указав позицию устройства на рабочем столе./Detach:"Device=2 Save Apply"
Это все основные ключи. Теперь немного о неочевидных ньюансах. Каждая изменяющаяя настройки секция имеет три дополнительных необязательных двоичных параметра Save, Global, Apply:
Параметр Save означает что данное изменение не нужно применить, а нужно сохранить в настройках системы. При этом если указан только этот логический параметр, то самого изменения режима совсем не произойдет до самой перезагрузки системы. При изменении настроек без указания этого ключа, новый режим будет применен немедленно, но он получится весьма "нестойким" и может быть потерян в процессе следующих запусков программы или при обработке следующих секций коммандной строки./Move:"Device=1 X=1280 Y=0 Save Apply"
/Mode:"Device=1 BPP=16 Save Global"
Параметр Global допустим только при наличии параметра Save и обозначает сохранение новых настроек для всех пользователей системы.
Параметр Apply имеет смысл только при наличии параметра Save и обозначает необходимость немедленного применения измененных настроек (при отсутствии Save изменения применяются сразу).
Следует иметь в виду, что при множественных изменениях настроек делать немедленное применение каждой измененной настройки не только нецелесообразно, но и вредно по той причине, что могут возникнуть конфликты. Например следующая попытка поменять местами мониторы DISPLAY2 с координатами (1280,0) и DISPLAY3 с координатами (2560,0) ни приведет ни к чему хорошему:
Дело в том, что сразу после применения первого изменения произойдет конфликт (мониторы наложатся) и окончательное положение будет непресказуемо. Чтобы избежать этого, нужно использовать отдельный ключ /Apply:/Move:"Device=2 X=2560 Y=0 Save Apply" /Move:"Device=3 X=1280 Y=0 Save Apply"
При этом будут последовательно изменены настройки положения мониторов, и только потом, когда уже никакого конфликта нет, эти настройки юудут загружены. Слезует иметь в виду, что при обработке ключа /Apply неизбежно будут потеряны режимы, которые были установленны без сохранения (т.е. без параметра Save), вне зависимости от того когда они были установленны (в этой же командной строке, или при предыдущих запусках)./Move:"Device=2 X=2560 Y=0 Save" /Move:"Device=3 X=1280 Y=0 Save" /Apply
Все ключи и параметры нечувствительны к регистру, порядок ключей и параметров тоже не важен. Все эти строки равнозначны:
Положение ключа /Apply так же не влияет на его работу: вне зависимости от его позиции, применение настроек будет произведено непосредственно перед завершением работы программы./move:"Device=2 x=2560 y=0 Save" /Move:"device=3 X=1280 Y=0 sAVE" /Apply
/APPLY /Move:"Save Device=2 X=2560 Y=0" /Move:"Y=0 Save Device=3 X=1280"
/Move:"Device=2 Y=0 X=2560 SAVE" /Apply /Move:"Device=3 Y=0 X=1280 Save"
============================================================
Что касается "острых углов", то ИМХО в программе таковых нет. Любой умеющий работать с коммандной строкой человек без проблем разберется. Если же будут найдены ошибки, то я готов по мере возможности исправлять их.
Последний раз редактировалось misha mike 19.11.2008 1:40, всего редактировалось 1 раз.
-
- Участник
- Сообщения: 532
- Зарегистрирован: 06.06.2005 3:29
- Откуда: Недалеко от Киева
- Контактная информация:
-
- Участник
- Сообщения: 532
- Зарегистрирован: 06.06.2005 3:29
- Откуда: Недалеко от Киева
- Контактная информация:
-
- Участник
- Сообщения: 532
- Зарегистрирован: 06.06.2005 3:29
- Откуда: Недалеко от Киева
- Контактная информация:
-
- Участник
- Сообщения: 532
- Зарегистрирован: 06.06.2005 3:29
- Откуда: Недалеко от Киева
- Контактная информация: