Рубрики
Без рубрики

Pywin32: как установить фон на рабочем столе на Windows

Получите практические, реальные навыки Python на наших ресурсах и пути

Автор оригинала: Mike Driscoll.

Вернуться в мою системные дни администратора, мы думали о установке фона на рабочем столе окна пользователя на определенное изображение на логине. Поскольку я отвечал за сценарии входа в систему, которые были написаны в Python, я решил сделать некоторые исследования, чтобы узнать, был ли способ сделать это. Мы рассмотрим два разных подхода к этой задаче в этой статье. Код в этой статье был протестирован с помощью Python 2.7.8 и Pywin32 219 на Windows 7.

Для первого подхода вам нужно будет скачать копию Pywin32 и установить его. Теперь давайте посмотрим на код:

# based on http://dzone.com/snippets/set-windows-desktop-wallpaper
import win32api, win32con, win32gui

#----------------------------------------------------------------------
def setWallpaper(path):
    key = win32api.RegOpenKeyEx(win32con.HKEY_CURRENT_USER,"Control Panel\\Desktop",0,win32con.KEY_SET_VALUE)
    win32api.RegSetValueEx(key, "WallpaperStyle", 0, win32con.REG_SZ, "0")
    win32api.RegSetValueEx(key, "TileWallpaper", 0, win32con.REG_SZ, "0")
    win32gui.SystemParametersInfo(win32con.SPI_SETDESKWALLPAPER, path, 1+2)

if __name__ == "__main__":
    path = r'C:\Users\Public\Pictures\Sample Pictures\Jellyfish.jpg'
    setWallpaper(path)

В этом примере мы используем образец образца, которое Microsoft предоставляет Windows. В вышеперечисленном коде мы EIDT ключа реестра Windows. Вы могли бы сделать первые 3 строки, используя собственное Python _winreg модуль Если вы хотели. Последняя строка говорит Windows установить на рабочий стол на изображение, которое мы предоставили.

Теперь давайте посмотрим на другой подход, который использует Модуль CTYPES и pywin32.

import ctypes
import win32con

def setWallpaperWithCtypes(path):
    # This code is based on the following two links
    # http://mail.python.org/pipermail/python-win32/2005-January/002893.html
    # http://code.activestate.com/recipes/435877-change-the-wallpaper-under-windows/
    cs = ctypes.c_buffer(path)
    ok = ctypes.windll.user32.SystemParametersInfoA(win32con.SPI_SETDESKWALLPAPER, 0, cs, 0)
    
if __name__ == "__main__":
    path = r'C:\Users\Public\Pictures\Sample Pictures\Jellyfish.jpg'
    setWallpaperWithCtypes(path)

В этом кусочке кода мы создаем буферный объект, который мы затем передаем в основном ту же команду, что и в предыдущем примере, а именно SystemParameterSinfoa Отказ Вы отметите, что нам не нужно редактировать реестр в этом последнем случае. Если вы проверяете ссылки, перечисленные в примерном коде, вы отметите, что некоторые пользователи нашли, что Windows XP позволил только установить растровые изображения в качестве фона рабочего стола. Я проверил с JPEG на Windows 7, и это работало нормально для меня.

Теперь вы можете создать свой собственный сценарий, который изменяет фон на рабочем столе на случайных интервалах! Или, может быть, вы просто будете использовать эти знания в своих собственных обязанностях системной администрации. Повеселись!