ChiefPilot
@ChiefPilot
Системный администратор

Как на C# выводить одну и ту же фотографию на несколько мониторов и синхронно менять её на другую

Проще всего понять, что я хочу сделать, посмотрев на функциональность хранителя экрана Яндекс.Фотки. Он берёт фотки из своей коллекции (я всегда выбираю коллекцию самых популярных фоток за день) и показывает их по очереди на всех имеющихся на ПК мониторах. Но синхронно — то есть на каждом мониторе одна и та же фотка, затем она меняется и эта новая опять же показывается сразу на всех мониторах. Захотел повторить его функциональность из-за того, что в Windows 8 перестала работать его полезнейшая функция: при нажатии на «пробел» он сохраняет текущую картинку в «мои картинки» пользователя. Почему-то даже ещё в «семёрке» это работало, а вот уже в «восьмёрке» нажатие на «пробел» приводит просто к выключению хранителя экрана (видимо эта клавиша не перехватывается программой что ли?).

Так вот, я разобрался с API Яндекс.Фоток, сделал подгрузку нужных фоток в кэш на ПК, разобрался с выводом фотки на главный экран. А вот как теперь повторять это всё на всех остальных экранах? Дело в том, что у меня создаётся форма, через которую выводится выбранная (во время Load формы) из каталога кэша фотка. Коротко так:

Image myImage = Image.FromFile(getFile);
screenBitmap = new Bitmap(myImage, region.Width, region.Height);///
Graphics MyGraphics = Graphics.FromImage(screenBitmap);
MyGraphics = this.CreateGraphics();
MyGraphics.DrawImage(screenBitmap, 0, 0);

Здесь же в Load формы создаётся и запускается Timer.Start(); уже внутри функции которого производится выбор и показ последующих фоток. И так до остановки хранителя экрана.

(подгрузка фоток, если что, производится в отдельном треде, который запускается ещё из главной функции программы (Main) как-то так:
Thread myThread = new Thread(DownLoadFileInBackground);
myThread.Name = «Downloader»;
myThread.Start();)

Я в курсе, как найти все мониторы через Screen.AllScreens. Но вот теперь вопрос: как вывести то это всё на все мониторы и синхронно? DrawImage может рисовать за пределами формы? Тогда можно было бы создать несколько вызовов DrawImage с разными координатами (и с разными битмапами). Но я проверил: DrawImage разные координаты понимает, но рисует только в пределах формы (которая у меня развёрнута только на весь основной дисплей). Что ещё? Развернуть одну форму на все мониторы сразу, а потом на ней рисовать по координатам каждого монитора? Так можно? А как? Особенно «а как» если мониторы, как у меня дома, не в линеечку, а настроены так: один слева от основного, а другой сверху над основным. Или создавать кучу отдельных форм? По одной на каждый монитор? А как тогда осуществлять синхронизацию смены фоток, если у каждой формы будет свой Timer со своей функцией и своим случайным выбором следующей фотки? Сделать выбор фотки внутри Main а не на форме и передавать следующую картинку каждой форме? А как это передать уже открытой форме? Или их закрывать каждый раз перед сменой картинки и открывать снова, передавая параметр? А не получится ли при этом сильно заметного торможения и мигания хранителя экрана? Что-то ещё? Наверняка наговорил много глупостей — заранее прошу прощения! Подтолкните, пожалуйста, в правильном направлении! У Яндекс.Фотки как-то же получилось? :)
  • Вопрос задан
  • 3738 просмотров
Пригласить эксперта
Ответы на вопрос 1
GavriKos
@GavriKos
Форма — это viewer, а model лучше держать отдельно. Т.е. выносите из формы таймер в какой то отдельный класс, который будет знать о всех формах и будет уметь им отдавать одну и ту же картинку. У формы просто заводите метод «SetImage», и по таймеру циклом идете по всем формам и дергаете этот метод, передавая в него картинку (это вроде будет указатель, а не копия, но могу ошибаться — давно не кодил на шарпе).
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы