在 Python 3 中更改 Windows 10 背景

Joh*_*ith 6 python windows ctypes python-3.x windows-10

我一直在寻找通过 python 脚本更改 Windows 10 桌面壁纸的最佳方法。当我尝试运行此脚本时,桌面背景变为纯黑色。

import ctypes

path = 'C:\\Users\\Patrick\\Desktop\\0200200220.jpg'

def changeBG(path):
    SPI_SETDESKWALLPAPER = 20
    ctypes.windll.user32.SystemParametersInfoA(20, 0, path, 3)
    return;

changeBG(path)
Run Code Online (Sandbox Code Playgroud)

我能做些什么来解决这个问题?我正在使用 python3

Roa*_*ner 7

对于 64 位窗口,请使用:

ctypes.windll.user32.SystemParametersInfoW
Run Code Online (Sandbox Code Playgroud)

对于 32 位窗口,请使用:

ctypes.windll.user32.SystemParametersInfoA
Run Code Online (Sandbox Code Playgroud)

如果你用错了,你会得到一个黑屏。您可以在控制面板 -> 系统和安全 -> 系统中找到您使用的版本

你也可以让你的脚本选择正确的一个:

import struct
import ctypes

PATH = 'C:\\Users\\Patrick\\Desktop\\0200200220.jpg'
SPI_SETDESKWALLPAPER = 20

def is_64bit_windows():
    """Check if 64 bit Windows OS"""
    return struct.calcsize('P') * 8 == 64

def changeBG(path):
    """Change background depending on bit size"""
    if is_64bit_windows():
        ctypes.windll.user32.SystemParametersInfoW(SPI_SETDESKWALLPAPER, 0, PATH, 3)
    else:
        ctypes.windll.user32.SystemParametersInfoA(SPI_SETDESKWALLPAPER, 0, PATH, 3)

changeBG(PATH)
Run Code Online (Sandbox Code Playgroud)

更新:

我已经对上述内容进行了疏忽。正如@Mark Tolonen在评论中所展示的,它取决于 ANSI 和 UNICODE 路径字符串,而不是操作系统类型。

如果您使用字节字符串路径,例如b'C:\\Users\\Patrick\\Desktop\\0200200220.jpg',请使用:

ctypes.windll.user32.SystemParametersInfoA
Run Code Online (Sandbox Code Playgroud)

否则,您可以将其用于普通的 unicode 路径:

ctypes.windll.user32.SystemParametersInfoW
Run Code Online (Sandbox Code Playgroud)

@Mark Tolonen 的答案和另一个答案中,argtypes 也更好地突出了这一点。

  • 真正的问题不是定义 argtypes。A 版本采用字节字符串作为第三个参数,W 版本采用 Unicode 字符串。无论操作系统类型如何,如果正确调用它们,您都可以使用 A 和 W。 (2认同)