Python —— 修改桌面壁纸
生活随笔
收集整理的這篇文章主要介紹了
Python —— 修改桌面壁纸
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
開發(fā)環(huán)境
?
?????Vs2017、Python3
?????注意,python調(diào)用了win32api,所以需要執(zhí)行安裝命令:pip install pywin32
?
?
代碼1
?????此方式,利用winAPI可以完成。
import win32api, win32gui, win32api, win32con import time#import cv2 def setWallPaper(pic):# open registerprint(pic)regKey = win32api.RegOpenKeyEx(win32con.HKEY_CURRENT_USER,"Control Panel\\Desktop",0,win32con.KEY_SET_VALUE)win32api.RegSetValueEx(regKey,"WallpaperStyle", 0, win32con.REG_SZ, "2")win32api.RegSetValueEx(regKey, "TileWallpaper", 0, win32con.REG_SZ, "0")# refresh screenwin32gui.SystemParametersInfo(win32con.SPI_SETDESKWALLPAPER,pic, 1+2)if __name__=='__main__':pic="C:/Users/Administrator/Desktop/bmp.bmp" #寫絕對路徑setWallPaper(pic)#img = cv2.imread(pic) #cv2.imshow("Image", img)代碼2
?????此方式,利用查找桌面句柄、+SDL可以完成。
?????備注:若spyxx查找出的桌面句柄為Progman的話需要按win+tab切換到WorkerW模式下才能正常找到桌面句柄,
##2022-01-07~~~~~動態(tài)桌面 ##################by Ljj ##程序必須用win+tad使能系統(tǒng)的workerw中間層控件模式 ##中間意外退出,二次運行sdlRenderer會使能失效,是因為沒有很好的退出,二次運行就可以 ##如果打開VC的軟件跑一次,二次運行sdlRenderer則不會出錯,很奇怪,未解之謎,但是我認為是SDL的底層沖突 ##~~~~~~2天,還是卡卡頓頓的,底層圖像渲染與播放五日#-*- coding: utf-8 -*- ##設(shè)置編碼方式import win32gui, win32api, win32con import os,cv2,time import sdl2.extdef setWallPaper(pic):#通過修改注冊表,進行背景設(shè)置# open registerprint(pic)#取得注冊表的要修改內(nèi)容,路徑所在文件夾的句柄regKey = win32api.RegOpenKeyEx(win32con.HKEY_CURRENT_USER,"Control Panel\\Desktop",0,win32con.KEY_SET_VALUE)# 設(shè)置背景的參數(shù),劇中,平鋪win32api.RegSetValueEx(regKey,"WallpaperStyle", 0, win32con.REG_SZ, "2")win32api.RegSetValueEx(regKey, "TileWallpaper", 0, win32con.REG_SZ, "0")# refresh screen,更新背景,1秒鐘更新大約2-4次,很卡頓,極限了,而且必須有路徑才可以win32gui.SystemParametersInfo(win32con.SPI_SETDESKWALLPAPER,pic, 1+2)class FindWindowsPro:#找刷新窗口的句柄# window10以上,再操作控件,底層壁紙之間,回家一個過渡層,這個窗口再底層壁紙和空間之間,修改這個窗口#如果沒有這個窗口,渲染器會把壁紙與控件渲染在一個串口上,所以通過win+tab,操作桌面,使得他生成這個過渡層#部分系統(tǒng)一直都有,我的沒有,很傷心>_<def __init__(self):#初始類內(nèi)部的全局句柄,傳遞所有的窗口self.hwnd_SHELLDLL_DefView = int()def FindWindowsTop(self):#找到所有的WorkerW,看看是不是桌面,通過查找下面有沒有控件子類來確定,如果有,找到子類之后的WorkerW#控件后的WorkerW就是可以修改的過渡層,比枚舉方法好,是只找WorkerW進行判斷,復雜度是nwin = win32gui.FindWindowEx(None,None,'WorkerW',None)while True:if win:tid = win32gui.FindWindowEx(win,None,'SHELLDLL_DefView',None)if tid:topwin = win32gui.FindWindowEx(None,win,'WorkerW',None)self.hwnd_SHELLDLL_DefView = topwinreturn topwinelse:win= win32gui.FindWindowEx(None,win,'WorkerW',None)else:breakclass SDL_Windowsdeal:#SDL對中間窗口進行圖像刷新與播放#初始化,創(chuàng)建這個句柄的窗口(覆蓋替換原來的窗口),讀入圖片轉(zhuǎn)換表面格式,創(chuàng)建渲染器def __init__(self,HWND):#sdl2.ext.init()self.HWND=HWND#self.RESOURCES = sdl2.ext.Resources(__file__, "resources")#self.window = sdl2.ext.Window("Hello World!", size=(1920, 1080))if sdl2.SDL_Init(sdl2.SDL_INIT_EVERYTHING) == -1: returnif sdl2.sdlimage.IMG_Init(sdl2.sdlimage.IMG_INIT_PNG) == 0: return#sdlWindow = sdl2.SDL_CreateWindow(b"Hello World", 0,0,1920,1080,0)self.ImgSurface = sdl2.sdlimage.IMG_Load(b"./AAA.bmp")if not self.ImgSurface: returnself.sdlWindow = sdl2.SDL_CreateWindowFrom(self.HWND)if not self.sdlWindow: returnself.sdlRenderer = sdl2.SDL_CreateRenderer(self.sdlWindow, -1, sdl2.SDL_RENDERER_ACCELERATED)if not self.sdlRenderer: returndef ShowWindow(self):#窗口刷新,講每個圖片,創(chuàng)建新的紋理,將紋理疊加到渲染器上,這個程序不滿意,因為每次都要創(chuàng)建紋理,待改進#渲染器要先刪除老的,再用紋理疊加一個空的渲染器,才可以更連續(xù)的播放圖片,所以這部分只要有一個空的渲染器就可以#這部分可以用三種方法:1,SDL視頻處理,Surface操作進行播放;2,將圖像轉(zhuǎn)換為紋理(sdlimage),更新紋理;#3.讀取圖片,Surface操作進行播放;# 第一種可以配合更好的音頻,但是涉及更深入的視頻音頻操作self.ImgSurface = sdl2.sdlimage.IMG_Load(b"./AAA.bmp")if not self.ImgSurface: returnself.sdlTexture = sdl2.SDL_CreateTextureFromSurface(self.sdlRenderer, self.ImgSurface)sdl2.SDL_RenderClear(self.sdlRenderer)if sdl2.SDL_RenderCopy(self.sdlRenderer, self.sdlTexture, None, None) != 0: returnsdl2.SDL_RenderPresent(self.sdlRenderer)#print(self.HWND)sdl2.SDL_FreeSurface(self.ImgSurface)sdl2.SDL_DestroyTexture(self.sdlTexture)def CloseWindow(self):#兩個不能刪掉,一個是SDL_Quit,一個是SDL_DestroyWindow,刪掉之后,不能對中間層窗口進行在此操作,#VC的跑一次,就又可以了,我認為SDL_DestroyWindow刪掉了那個窗口,然后就不存在了,后面沒辦法操作了#VC尋找方式不同,是找父類,而py只能找子類,差異很大print("視頻播放完成!")sdl2.SDL_DestroyTexture(self.sdlTexture)#sdl2.SDL_DestroyRenderer(self.sdlRenderer)#sdl2.SDL_DestroyWindow(self.sdlWindow)sdl2.SDL_FreeSurface(self.ImgSurface)sdl2.sdlimage.IMG_Quit()#sdl2.SDL_Quit()if __name__=='__main__':#不能刪掉explorer,因為中間窗口就會消失,只能通過再次的wim+tab激活,但是這個不人性,程序需要太多人工介入#os.system('taskkill /f /im explorer.exe')#os.system("start explorer")# 按下ctrl,本來想做一個按鍵激活,但是系統(tǒng)沒有winkey的鍵值,所以不能虛擬鍵盤操作,放棄#win32api.keybd_event(0x11, 0, 0, 0)#win32api.keybd_event(0x53, 0, win32con.KEYEVENTF_KEYUP, 0)FindTopWindow = FindWindowsPro()FindTopWindow.FindWindowsTop()#print(FindTopWindow.hwnd_SHELLDLL_DefView)#cap = cv2.VideoCapture("C:/Users/Administrator/Desktop/你的名字.flv")cap = cv2.VideoCapture("./flv.flv")pic = "./AAA.bmp" #寫絕對路徑#SDL_Window = SDL_Windowsdeal(FindTopWindow.hwnd_SHELLDLL_DefView)if FindTopWindow.hwnd_SHELLDLL_DefView:SDLWindeal = SDL_Windowsdeal(FindTopWindow.hwnd_SHELLDLL_DefView)while cap.isOpened():ret, frame = cap.read()if ret:cv2.imwrite(pic, frame)SDLWindeal.ShowWindow()time.sleep(0.040)else:print("視頻播放完成!")break#os.system("Sleep(500)")# 3.釋放資源cap.release()cv2.destroyAllWindows()SDLWindeal.CloseWindow()else:print("窗體結(jié)構(gòu)不對!")?
關(guān)注
筆者 - jxd
微信公眾號搜索 “碼農(nóng)總動員” 或 微信掃描下方二維碼,了解更多你不知道的XX,O(∩_∩)O
總結(jié)
以上是生活随笔為你收集整理的Python —— 修改桌面壁纸的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 李氏第二法分析稳定性matlab,9-4
- 下一篇: CPtrArray、CObArray类