разные обои для каждого экрана для настроек нескольких мониторов в Windows - PullRequest
2 голосов
/ 17 декабря 2010

Я использую:

ctypes.windll.user32.SystemParametersInfoA(SPI_SETDESKWALLPAPER,
                                           0, "picturefile", 0)

Для смены обоев.

Но мне интересно, есть ли какой-нибудь простой способ разместить разные обои на каждом экране.

Эта функция не является стандартной в Windows, но есть внешние приложения, такие как ultramon, которые делают это. Кто-нибудь знает, как это работает?

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

Кроме того, как я могу получить некоторую информацию о настройке монитора, разрешении каждого экрана и их расположении? Как то, что вы видите в настройках отображения графического интерфейса в Windows, но в цифрах.

1 Ответ

6 голосов
/ 17 декабря 2010
  1. После объединения изображений в большое изображение необходимо установить режим обоев на мозаичный , чтобы изображение охватывало рабочий стол (в противном случае оно будет перезагружаться при каждоммонитор).

    Пара способов сделать это:

    a) Использование IActiveDesktop (что не требует использования Active Desktop, нене переживай).Это хорошо, так как в Win7 новые обои исчезнут.

    Вы создаете COM-объект IActiveDesktop / CLSID_ActiveDesktop, а затем вызываете SetWallpaper, SetWallpaperOptions и, наконец, ApplyChanges.(Поскольку я не разработчик Python, я не уверен, как именно вы получаете доступ к COM-объекту, извините.)

    ИЛИ:

    b) Через реестр.Это не так хорошо, но работает достаточно хорошо.

    Под HKEY_CURRENT_USER\Control Panel\Desktop установлено:

    • TileWallpaper до (REG_SZ) 1 (то есть строка «1»не число 1)
    • WallpaperStyle до (REG_SZ) 0 (т. е. строка «0», а не число 0)
    • Затем вызовите SystemParameterInfo (SPI_SETDESKTOPWALLPAPER ...) как выdo уже.

    .

    Кстати, код, который я просматриваю, использует IActiveDesktop и в случае сбоя возвращается к реестру, передает SPIF_UPDATEINIFILE | SPIF_SENDCHANGE в качествепоследний аргумент для SystemParameterInfo;в настоящий момент вы передаете 0, что может быть неверно.

  2. EnumDisplayMonitors - это Win32 API для получения подробной информации о мониторах, включая их размеры экрана и позиции относительно каждогопрочее.

    Этот API возвращает свои результаты через функцию обратного вызова, которую вы должны предоставить.(Он вызывается один раз для каждого монитора.) Я не являюсь разработчиком Python, поэтому я не уверен, как вы можете вызвать такую ​​функцию из Python.

    Быстрый Google для "Python EnumWindows" (EnumWindows - этообычно используемый API, который возвращает результаты тем же способом) находит людей, говорящих об этом, и использующих функцию Lambda для обратного вызова, так что похоже, что это возможно, но я оставлю это кому-то, кто знает больше о Python.

    Примечание: не забудьте справиться с мониторами, которые не находятся рядом друг с другом или не выровнены друг с другом.Ваше скомпилированное изображение, возможно, должно иметь пустые области, чтобы все выстраивалось в линию прямо на всех мониторах.Если вы передвинете один из мониторов и сделаете скриншот PrtScn для всего рабочего стола, вы увидите, что я имею в виду в результате.

...