Управление мониторами из командной строки

Решение вопросов, связанных с прикладными программами, операционными системами и прочим ПО.

Модераторы: BlackIsle, Lovrik

Ответить
JaJa
Клубмен
Клубмен
Сообщения: 3253
Зарегистрирован: 08.10.2003 0:15
Откуда: МИРовой Клуб
Контактная информация:

Управление мониторами из командной строки

Сообщение JaJa » 06.10.2008 20:21

Собственно сабж.
Есть задача:
На работе и дома теперь двухмониторные конфигурации.
На работе основным дисплеем должна быть панель ноута, а внешний LCD вторичным.
Дома наоборот: основной дисплей -- внешний, а панель ноута вторичная.

Для nvidia командная сторока для переключения мониторов известна:
rundll32.exe NvCpl.dll,dtcfg primary [Х]
где Х -- это номер монитора.
Да и API NvCpl.dll описано в PDF
А вот какая это строка для ATI, и вообще есть в этом направлении у кого-нибудь наработки?

DrEvil
Администратор Judge Dredd
Сообщения: 17062
Зарегистрирован: 17.01.2003 11:52
Контактная информация:

Сообщение DrEvil » 06.10.2008 21:14

AMD предлагают драйвер писать http://developer.amd.com/documentation/ ... x#open_gpu . RivaTuner позволяет писать в регистры GPU, правда, Unwinder эту функцию спрятал, но при личном обращении может и раскрыть. Так что узнав из документации нужные значения регистров, теоретически возможно конфигурировать GPU минуя штатный драйвер, правда, как Windows будет узнавать об изменениях - непонятно.
API NvCpl.dll описано в PDF
Угу, вот только в Vista нет этого API. Да и дока 2005 года.

JaJa
Клубмен
Клубмен
Сообщения: 3253
Зарегистрирован: 08.10.2003 0:15
Откуда: МИРовой Клуб
Контактная информация:

Сообщение JaJa » 06.10.2008 22:16

AMD предлагают драйвер писать
Какая удача, только сегодня просетапил MS visual studio 2008 express

Ладно, пока попробуем побороться так, а вообще как-то печально это :(

DrEvil
Администратор Judge Dredd
Сообщения: 17062
Зарегистрирован: 17.01.2003 11:52
Контактная информация:

Сообщение DrEvil » 06.10.2008 22:50

JaJa
Вроде есть в комплекте дров AMD утильсырье cli.exe, может того этого, поковырять чем-нибудь.

JaJa
Клубмен
Клубмен
Сообщения: 3253
Зарегистрирован: 08.10.2003 0:15
Откуда: МИРовой Клуб
Контактная информация:

Сообщение JaJa » 07.10.2008 9:15

cli.exe не входит в поставку драйверов fireGL, там по прежнему старая контрольная панель.

Пока штудирую это http://msdn.microsoft.com/en-us/library ... S.85).aspx
Господи, спаси мой компьютер...

misha mike
Участник
Сообщения: 532
Зарегистрирован: 06.06.2005 3:29
Откуда: Недалеко от Киева
Контактная информация:

Сообщение misha mike » 07.10.2008 17:26

Работающий код у меня уже есть, нужно только оформить это все в виде законченгого продукта. Сегодня времени скорее всего уже не будет, на днях, думаю, доделаю.

JaJa
Клубмен
Клубмен
Сообщения: 3253
Зарегистрирован: 08.10.2003 0:15
Откуда: МИРовой Клуб
Контактная информация:

Сообщение JaJa » 07.10.2008 18:16

misha mike, Отлично! Пока отделался "профилями оборудования", потерял режим гибернации

DrEvil
Администратор Judge Dredd
Сообщения: 17062
Зарегистрирован: 17.01.2003 11:52
Контактная информация:

Сообщение DrEvil » 07.10.2008 18:26

потерял режим гибернации
Невелика потеря, и так не работает толком на компьютерах с 2+ Гб ОЗУ.

JaJa
Клубмен
Клубмен
Сообщения: 3253
Зарегистрирован: 08.10.2003 0:15
Откуда: МИРовой Клуб
Контактная информация:

Сообщение JaJa » 07.10.2008 18:33

DrEvil, Так я им пользуюсь! У меня так комп не перезагружается по 2..3 недели, пока новые обновления не выйдут. И 2ГБ ОЗУ.

Плюс к тому же у меня есть небольшая задумка по этой штуке на будущее. А будущее говорит, что количество мониторов достигнет 4-х.

misha mike
Участник
Сообщения: 532
Зарегистрирован: 06.06.2005 3:29
Откуда: Недалеко от Киева
Контактная информация:

Сообщение misha mike » 07.10.2008 19:33

DrEvil, у меня 2 гига, все работает нормально.

JaJa
Клубмен
Клубмен
Сообщения: 3253
Зарегистрирован: 08.10.2003 0:15
Откуда: МИРовой Клуб
Контактная информация:

Сообщение JaJa » 16.10.2008 20:58

Итак, для десктопов данная проблема решена полностью благодаря misha mike :bow:, для ноутбука всё оказалось не так просто.

DrEvil
Администратор Judge Dredd
Сообщения: 17062
Зарегистрирован: 17.01.2003 11:52
Контактная информация:

Сообщение DrEvil » 17.10.2008 0:33

misha mike
Публичный релиз планируется?

misha mike
Участник
Сообщения: 532
Зарегистрирован: 06.06.2005 3:29
Откуда: Недалеко от Киева
Контактная информация:

Сообщение misha mike » 16.11.2008 4:34

DrEvil, блин. Давно не загядывал в этот раздел, а форум слишком быстрый, проглядел ровно на месяц. Мне в общем-то все равно, но в данном конкретном случае требуется согласие господина JaJa. Если он разрешает, то я могу предоставить сею утилиту и руководство по ее использованию совершенно бесплатно.

JaJa
Клубмен
Клубмен
Сообщения: 3253
Зарегистрирован: 08.10.2003 0:15
Откуда: МИРовой Клуб
Контактная информация:

Сообщение JaJa » 16.11.2008 15:42

Если он разрешает
???
Господин JaJa никогда не претендовал на правообладание. Он был за создание продукта и не более :hitrost:

Так что я не только не против, но и ЗА.

DrEvil
Администратор Judge Dredd
Сообщения: 17062
Зарегистрирован: 17.01.2003 11:52
Контактная информация:

Сообщение DrEvil » 16.11.2008 16:08

misha mike
Только просьба учесть, что это г-н JaJa опытный киберсантехник, и способен справиться со многим, а перед паблик релизом хоть чуточку протестировать и зашлифовать напильником особо острые углы не помешает.

misha mike
Участник
Сообщения: 532
Зарегистрирован: 06.06.2005 3:29
Откуда: Недалеко от Киева
Контактная информация:

Сообщение misha mike » 16.11.2008 18:29

JaJa, это вы так говорите. Мне, как вольнонаемному программисту, попадались разные заказчики. Поэтому я стараюсь быть максимально осторожным в таких вопросах.

DrEvil, сама программа лежит тут: http://home.mikelab.kiev.ua/PROGRAMS/dispdeal.rar

А вот то, что я писал по ее использованию:
============================================================
Программа коммандной строки. Краткую справку выдает при запуске без параметров. В качестве идентификаторов мониторов используются имена, которые можно узнать запустив программу с ключиком /List. В качестве имени устройства допускается указание как полного имени \\.\DISPLAY2, так и сокращенного DISPLAY2, кроме того допкускается указание просто номера 2.

В одном вызове может быть сколько угодно секций /Mode (изменение режима), /Move (изменение позиции монитора), /Detach (отключение монитора) и /Realign (сброс вторичного монитора). Остальные секции засчитываются только при первом вхождении.

Указание режима при помощи /Mode возможно двумя путями. С указанием индекса режима:
/Mode:"Device=1 Index=150"
Значения индексов всех доступных для монитора видеорежимов можно узнать при момощи ключа /Modes:
/Modes:"Device=1"
Также можно задавать режим поэлементно. При этом не нужно указывать все элементы, достаточно только тех, которые вас интересуют. Например если нужно изменить только глубину цвета, то кроме собственно устройства указываем только этот параметр:
/Mode:"Device=1 BPP=16"
При этом остальные параметры по возможности будут сохранены (это зависит от того, является ли допустимой измененная конфигурация). То же самое в определенной степени касается и разрешения, в ряде случаев оказывается достаточно указания только одного измерения:
/Mode:"Device=1 Width=1024"
Первичный монитор назначается при помощи ключа /Primary:
/Primary:"Device=1"
При изменении первичного монитора производится та же последовательнось действий, что и при изменении средствами настроек экрана. После изменения первичного экрана может потребоваться коррекция позиции мониторов на рабочем столе и сброс вторичного монитора при помощи ключей /Move и /Realign:
/Move:"Device=1 X=1280 Y=0"
Ключ /Realign выполняет рекомендованную майкрософтом последовательность действий после смены первичного монитора. Но т.к. сообщение об отключении монитора до программ доходит не мгновенно, нужно выдержать некоторую паузу, в течении которой оболочка убедится что данный монитор действительно больше не первичный и переползет на другой. Размер паузы (в миллисекундах) указывается в необязательном параметре Relax, и по-умолчанию равен 1000 (одна секунда), это значение следует увеличить, если перемещение панели задач не происходит. Ключ /Realign имеет два варианта вызова. Без указания устройства происходит последовательный сброс всех вторичных мониторов:
/Realign
/Realign:"Relax=2000"
Если же явно указать бывшее первичное, а ныне вторичное устройство, то произойдет только его сброс (рекомендую делать именно так):
/Realign:"Device=1 Relax=2000"
Перед обработкой ключа /Realign всегда происходит применение изменений (т.е. выполняется неявный вызов обработчика ключа /Apply). Однако в зависимости от тонкостей драйверов, также может быть необходимыи отдельное окончательное применение настроек ключем /Apply.

Таким образом строка полного переключения первичного монитора выглядит так (три разных варианта):
/Primary:"Device=2 Save" /Realign:"Device=1 Relax=2000" /Apply
/Primary:"Device=2 Save" /Realign:"Relax=2000" /Apply
/Primary:"Device=2 Save" /Realign /Apply
Кроме того, есть еще один ключ: /Detach. Этот ключ позволяет отключить заданное устройство от рабочего стола:
/Detach:"Device=2 Save Apply"
Подключить отключенное устройство можно вызовом ключа /Move, просто указав позицию устройства на рабочем столе.

Это все основные ключи. Теперь немного о неочевидных ньюансах. Каждая изменяющаяя настройки секция имеет три дополнительных необязательных двоичных параметра Save, Global, Apply:
/Move:"Device=1 X=1280 Y=0 Save Apply"
/Mode:"Device=1 BPP=16 Save Global"
Параметр Save означает что данное изменение не нужно применить, а нужно сохранить в настройках системы. При этом если указан только этот логический параметр, то самого изменения режима совсем не произойдет до самой перезагрузки системы. При изменении настроек без указания этого ключа, новый режим будет применен немедленно, но он получится весьма "нестойким" и может быть потерян в процессе следующих запусков программы или при обработке следующих секций коммандной строки.
Параметр Global допустим только при наличии параметра Save и обозначает сохранение новых настроек для всех пользователей системы.
Параметр Apply имеет смысл только при наличии параметра Save и обозначает необходимость немедленного применения измененных настроек (при отсутствии Save изменения применяются сразу).

Следует иметь в виду, что при множественных изменениях настроек делать немедленное применение каждой измененной настройки не только нецелесообразно, но и вредно по той причине, что могут возникнуть конфликты. Например следующая попытка поменять местами мониторы DISPLAY2 с координатами (1280,0) и DISPLAY3 с координатами (2560,0) ни приведет ни к чему хорошему:
/Move:"Device=2 X=2560 Y=0 Save Apply" /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 неизбежно будут потеряны режимы, которые были установленны без сохранения (т.е. без параметра Save), вне зависимости от того когда они были установленны (в этой же командной строке, или при предыдущих запусках).

Все ключи и параметры нечувствительны к регистру, порядок ключей и параметров тоже не важен. Все эти строки равнозначны:
/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"
Положение ключа /Apply так же не влияет на его работу: вне зависимости от его позиции, применение настроек будет произведено непосредственно перед завершением работы программы.
============================================================

Что касается "острых углов", то ИМХО в программе таковых нет. Любой умеющий работать с коммандной строкой человек без проблем разберется. Если же будут найдены ошибки, то я готов по мере возможности исправлять их.
Последний раз редактировалось misha mike 19.11.2008 1:40, всего редактировалось 1 раз.

DrEvil
Администратор Judge Dredd
Сообщения: 17062
Зарегистрирован: 17.01.2003 11:52
Контактная информация:

Сообщение DrEvil » 16.11.2008 22:18

misha mike
ОК, завтра выложу на сайт и сделаю новость. Ветку поддержки эту оставим, или новую предпочитаете создать?

misha mike
Участник
Сообщения: 532
Зарегистрирован: 06.06.2005 3:29
Откуда: Недалеко от Киева
Контактная информация:

Сообщение misha mike » 16.11.2008 22:30

DrEvil, как будет угодно.

DrEvil
Администратор Judge Dredd
Сообщения: 17062
Зарегистрирован: 17.01.2003 11:52
Контактная информация:

Сообщение DrEvil » 17.11.2008 20:25

misha mike
Создайте пожалуйста новую тему, по образу VMT. Здесь все-таки будет проблему в общем обсуждать, а поддержку программы лучше вынести в отдельную ветку.

misha mike
Участник
Сообщения: 532
Зарегистрирован: 06.06.2005 3:29
Откуда: Недалеко от Киева
Контактная информация:

Сообщение misha mike » 18.11.2008 1:09

Создавать в этом разделе, или там же, где VMT?

DrEvil
Администратор Judge Dredd
Сообщения: 17062
Зарегистрирован: 17.01.2003 11:52
Контактная информация:

Сообщение DrEvil » 18.11.2008 14:26

В этом разделе. Кстати, в каких версиях Windows она работает? В Vista работает?

misha mike
Участник
Сообщения: 532
Зарегистрирован: 06.06.2005 3:29
Откуда: Недалеко от Киева
Контактная информация:

Сообщение misha mike » 18.11.2008 19:29

DrEvil, должна работать везде (но пока не проверял, сегодня ночью уже проверю и создам тему).

misha mike
Участник
Сообщения: 532
Зарегистрирован: 06.06.2005 3:29
Откуда: Недалеко от Киева
Контактная информация:

Сообщение misha mike » 19.11.2008 1:17

Протухла моя виста в виртуалке :(
Поэтому тестирование немного отложу (пока дистрибутив не найду).

Ответить