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

  • Вопрос

  • Проще всего объяснить, что я хочу сделать, посмотрев на функциональность хранителя экрана Яндекс.Фотки. Он берёт фотки из своей коллекции (я всегда выбираю коллекцию самых популярных фоток за день) и показывает их по очереди на всех имеющихся на ПК мониторах. Но синхронно — то есть на каждом мониторе одна и та же фотка, затем она меняется и эта новая опять же показывается сразу на всех мониторах. Захотел повторить его функциональность из-за того, что в 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 а не на форме и передавать следующую картинку каждой форме? А как это передать уже открытой форме? Или их закрывать каждый раз перед сменой картинки и открывать снова, передавая параметр? А не получится ли при этом сильно заметного торможения и мигания хранителя экрана? Что-то ещё? Наверняка наговорил много глупостей — заранее прошу прощения! Подтолкните, пожалуйста, в правильном направлении! У Яндекс.Фотки как-то же получилось? :)


    1 ноября 2013 г. 9:01

Ответы

  • Добрый день.

    Я бы:

    1. Создавал по отдельной форме на каждый монитор.

    2. Завел бы на главной форме класс, который отвечал бы за выбор фоток.

    3. На событие изменение фотографии в этом классе подписал бы метод у каждой формы, который получив событие из его параметров брал бы фотку и показывал у себя.

    Попробуйте, если будут еще вопросы, задавайте постараюсь помочь.

    1 ноября 2013 г. 13:14
    Отвечающий
  • 1. Нужна служба, будет принимать bool(pictureDownloaded) от всех подключенных компов, которые асинхронно* будут скачивать картинку с сайта, если скачали все, то подаем сигнал с сервера поменять картинк, и включаем таймер, по истечении все заново(качаем, даем сигнал что скачал, принимаем сигналы от всех компов, даем сигнал поменять, ждем, . . .. по кругу)

    Очень интересно будет поработать с яндекс апи, попробую)) время будет отпишусь

    1 ноября 2013 г. 16:10

Все ответы

  • Добрый день.

    Я бы:

    1. Создавал по отдельной форме на каждый монитор.

    2. Завел бы на главной форме класс, который отвечал бы за выбор фоток.

    3. На событие изменение фотографии в этом классе подписал бы метод у каждой формы, который получив событие из его параметров брал бы фотку и показывал у себя.

    Попробуйте, если будут еще вопросы, задавайте постараюсь помочь.

    1 ноября 2013 г. 13:14
    Отвечающий
  • 1. Нужна служба, будет принимать bool(pictureDownloaded) от всех подключенных компов, которые асинхронно* будут скачивать картинку с сайта, если скачали все, то подаем сигнал с сервера поменять картинк, и включаем таймер, по истечении все заново(качаем, даем сигнал что скачал, принимаем сигналы от всех компов, даем сигнал поменять, ждем, . . .. по кругу)

    Очень интересно будет поработать с яндекс апи, попробую)) время будет отпишусь

    1 ноября 2013 г. 16:10