2016-11-13 86 views
1

这就是我想:如何在python中设置桌面背景? (窗口)

import ctypes 
import os 
drive = "F:\\" 
folder = "Keith's Stuff" 
image = "midi turmes.png" 
image_path = os.path.join(drive, folder, image) 
SPI_SETDESKWALLPAPER = 20 
ctypes.windll.user32.SystemParametersInfoA(SPI_SETDESKWALLPAPER, 0, image_path, 3) 

Basicaly,这段代码显然是应该设置桌面背景,以MIDI turmes.png,它改变了桌面,但是,对于一些奇怪的原因,它总是一个绿色的背景(我在Windows中的个性化设置是图像背后的绿色背景)我该如何解决这个问题,并使桌面看起来像这样?:http://i.imgur.com/VqMZF6H.png

+0

你试过使用JPG图像而不使用PNG吗? –

+0

Python 2或3?另外尝试设置函数的argtypes和restype。 –

+0

是的,我试过了。我正在使用python 3.5.2 – BadArtistKeith

回答

1

以下这些适用于我。我使用的是Windows 10的64位和Python 3

import os 
import ctypes 
from ctypes import wintypes 

drive = "c:\\" 
folder = "test" 
image = "midi turmes.png" 
image_path = os.path.join(drive, folder, image) 

SPI_SETDESKWALLPAPER = 0x0014 
SPIF_UPDATEINIFILE = 0x0001 
SPIF_SENDWININICHANGE = 0x0002 

user32 = ctypes.WinDLL('user32') 
SystemParametersInfo = user32.SystemParametersInfoW 
SystemParametersInfo.argtypes = ctypes.c_uint,ctypes.c_uint,ctypes.c_void_p,ctypes.c_uint 
SystemParametersInfo.restype = wintypes.BOOL 
print(SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, image_path, SPIF_UPDATEINIFILE | SPIF_SENDWININICHANGE)) 

的重要组成部分,是确保如果使用SystemParametersInfoW使用Unicode字符串image_path,和一个字节字符串,如果使用SystemParametersInfoA。请记住,在Python 3中,字符串是默认的Unicode。

同样设置argtypesrestype也是一种很好的做法。你甚至可以“说谎”并将第三个argtypes参数设置为c_wchar_pSystemParametersInfoW,然后ctypes将验证你传递的是Unicode字符串而不是字节字符串。

+0

它的工作原理,谢谢! – BadArtistKeith

+0

你能指出一个能解释到底是什么的链接吗?我一直在编写脚本来做窗口事情多年,但这个过程总是感觉随机。我尝试了一些,它不起作用,然后我谷歌,直到我找到一个工作片段。当我用大多数语言来做这件事的时候,我实际上学到了一些东西,但是使用奇怪的名字,可信的方法和可怕的混乱,这是Windows API文档,我无法理解它 – yuvi