我正在尝试使用Python脚本来更改Windows 7计算机上的壁纸。 如果有关系,我从node-webkit应用程序中调用脚本。
缩短的脚本如下所示:
# ... result = ctypes.windll.user32.SystemParametersInfoA(20, 0, path, 0)
它通常是有效的,但有时候,看起来是随机的,事实并非如此。 有没有什么办法可以让我检索比状态码(0或1)更多的关于错误的信息?
我一直在尝试使用GetLastError,它有时被提到与ctypes库有关,但一直无法提取任何错误信息。
ctypes文档建议使用use_last_error=True
以安全的方式捕获GetLastError()
。 请注意,在引发WinError
时,您需要检索错误代码:
from ctypes import * SPI_SETDESKWALLPAPER = 0x0014 SPIF_SENDCHANGE = 2 SPIF_UPDATEINIFILE = 1 def errcheck(result, func, args): if not result: raise WinError(get_last_error()) user32 = WinDLL('user32',use_last_error=True) SystemParametersInfo = user32.SystemParametersInfoW SystemParametersInfo.argtypes = [c_uint,c_uint,c_void_p,c_uint] SystemParametersInfo.restype = c_int SystemParametersInfo.errcheck = errcheck SystemParametersInfo(SPI_SETDESKWALLPAPER,0,r'xxx',SPIF_UPDATEINIFILE | SPIF_SENDCHANGE)
输出:
Traceback (most recent call last): File "C:\test.py", line 17, in <module> SystemParametersInfo(SPI_SETDESKWALLPAPER,0,r'c:\xxx',SPIF_UPDATEINIFILE | SPIF_SENDCHANGE) File "C:\test.py", line 9, in errcheck raise WinError(get_last_error()) FileNotFoundError: [WinError 2] The system cannot find the file specified.
所有这些工作的替代方法是使用pywin32并调用win32gui.SystemsParametersInfo
。
如果将壁纸设置为不支持格式的现有文件,即使未设置壁纸,您也会收到“操作成功完成”。
这里是我使用的代码,如果你输入一个不存在的路径,会引发一个错误。 如果文件存在,函数不会引发错误,但格式不受支持。
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之前解决了问题,然后将其设置为壁纸。