如果您将壁纸设置为不支持的格式的现有文件,则会收到“操作已成功完成”的消息,即使壁纸未设置。
以下是我使用的代码,如果您输入不存在的路径,则会引发错误。如果文件存在但格式不受支持,则该函数不会引发错误。
import ctypes, os, sys
from ctypes import WinError, c_int, WINFUNCTYPE, windll
from ctypes.wintypes import BOOL, HWND, LPCSTR, UINT
path = os.path.abspath(os.path.join(os.getcwd(), sys.argv[1]))
SPIF_SENDCHANGE = 2
SPIF_UPDATEINIFILE = 1
prototype = WINFUNCTYPE(BOOL, UINT, UINT, LPCSTR, UINT)
paramflags = (1, "SPI", 20), (1, "zero", 0), (1, "path", "test"), (1, "flags", 0)
SetWallpaperHandle = prototype(("SystemParametersInfoA", windll.user32), paramflags)
def errcheck (result, func, args):
if result == 0:
raise WinError()
return result
SetWallpaperHandle.errcheck = errcheck
try:
i = SetWallpaperHandle(path=str(path), flags=(SPIF_UPDATEINIFILE | SPIF_SENDCHANGE))
print(i)
except Exception as e:
print(e)
在将图片设置为壁纸之前,我将它们转换为.jpg格式来解决问题。
WM_SETTINGCHANGE
消息。 - Eryk Sunctypes.set_last_error(0)
。话虽如此,使用use_last_error
可能是不必要的。从FFI调用返回路径上不应该有任何Win32调用会修改线程的LastErrorValue
,因此它只是解决了信号处理程序或由于对象释放而导致的Win32调用的可能性。无论如何,这是一个好习惯。 - Eryk Sunraise WinError()
,即使文件不存在,我也会得到The operation completed successfully
。这似乎是一个需要使用use_last_error
并通过get_last_error
检索错误代码的情况。 - Mark Tolonen.JPG
)。要检查的一件事是确保如果您使用SystemParametersInfoW
,则传递Unicode字符串,而SystemParametersInfoA
需要一个字节字符串。使用c_void_p
作为第三个参数时,它不会检查您是否正确。或者根据需要将c_void_p
更改为c_char_p
或c_wchar_p
以强制进行检查。 - Mark Tolonen