Изменить обои в Python для пользователя, будучи системой

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

import ctypes
import Image

pathToBmp = "PATH TO BMP FILE"
SPI_SETDESKWALLPAPER = 20  
ctypes.windll.user32.SystemParametersInfoA(SPI_SETDESKWALLPAPER, 0, pathToBmp , 0) 

это работает, когда я запускаю файл .py, это работает, когда я конвертирую его с помощью py2exe и запускаю exe под текущим пользователем, но когда я запускаю exe как SYSTEM, фон текущего пользователя не меняется.

Этого, конечно, следовало ожидать. Но я не знаю, как это решить.

Кстати, не имеет значения, меняет ли какое-либо из ваших решений фон текущего пользователя или фон всех пользователей.

Спасибо за уделенное время.


person user1952084    schedule 20.01.2013    source источник
comment
Вы не должны использовать from ... import *, это не очень хороший стиль для кодирования, так как при отладке и т. д. нужно искать модули, если переменная не определена в коде.   -  person pradyunsg    schedule 20.01.2013
comment
@paddila Я изменил код, поэтому больше не использую from ... import *. Он все еще имеет тот же результат.   -  person user1952084    schedule 20.01.2013
comment
Я предоставил ответ с примером для аналогичного вопроса SO. изменить фон рабочего стола   -  person Vlad Bezden    schedule 07.06.2016


Ответы (1)


Как насчет создания ключа значения в реестре по адресу:

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run

Это изменит фон, когда пользователь войдет в систему.

Чтобы попробовать, напишите этот скрипт, назовите его, например, SetDesktopBackground.py, как угодно:

#!python

from ctypes import *
from os import path

SPI_SETDESKWALLPAPER = 0x14
SPIF_UPDATEINIFILE   = 0x1

lpszImage = path.join(path.dirname(path.realpath(__file__)), 'your_image.jpg')

SystemParametersInfo = windll.user32.SystemParametersInfoA

SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, lpszImage, SPIF_UPDATEINIFILE)

Не забудьте поместить изображение your_image.jpg в тот же каталог. Затем откройте редактор реестра:

Start > Search > type regedit.exe

Затем перейдите по пути:

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run

Щелкните правой кнопкой мыши и выберите New > String Value и введите любое имя для этого значения.

Щелкните правой кнопкой мыши на этом новом значении и выберите Modify, в поле Data Value напишите:

"C:\Python26\pythonw.exe" "C:\Path\To\SetDesktopBackground.py"

Чтобы проверить это, выйдите из системы и войдите снова. Фон должен меняться, когда этот пользователь входит в систему.

Это был ручной способ сделать это, вы можете использовать _winreg в своем приложении для создайте значение во время установки:

#!python

from _winreg import *
from sys import executable
from os import path

subkey  = 'Software\\Microsoft\\Windows\\CurrentVersion\\Run'
script  = 'C:\\Path\\To\\SetDesktopBackground.py'
pythonw = path.join(path.dirname(executable), 'pythonw.exe')

hKey = OpenKey(HKEY_CURRENT_USER, subkey, 0, KEY_SET_VALUE)

SetValueEx(hKey, 'MyApp', 0, REG_SZ, '"{0}" "{1}"'.format(pythonw, script))

CloseKey(hKey)
person Community    schedule 21.01.2013
comment
__file__ не будет работать в исполняемом файле, сгенерированном py2exe. Вместо этого можно использовать sys.argv[0]. - person jfs; 07.04.2014