概述
源码地址:https://github.com/starzc-galaxy/Dynamic-desktop.git
实现原理:
Windows桌面系统保留的消息
十六进制:
0x005C
十进制:
1324
当你将这个消息发送到Windows桌面时,桌面程序就会自动生成一个透明窗口:WorkerW,Progman上的背景窗口和图标List都会成为WorkerW窗口的子窗口,同时还会产生一个分屏窗口:WorkerW同名的窗口,该窗口属于Progman!windows 最底层的窗体 Program Manage,想要你的窗体出现在桌面icon后面,只需要把自己的窗体作为 Program Manage 的子窗体,然后隐藏原先的壁纸层就可以了,win10 你可以选择在原先壁纸之上和icon之下的位置(可以省略隐藏原壁纸),但这种是兼容win7和win10的做法。
可以利用windows API 的win32gui来实现这种逻辑
def gethandle(self):
hwnd = win32gui.FindWindow("Progman", "Program Manager")
a = win32gui.SendMessageTimeout(hwnd, 0x052C, 0, None, 0, 0x03E8)
print("发送结果:",a)
hwnd_WorkW = None
while 1:
hwnd_WorkW = win32gui.FindWindowEx(None, hwnd_WorkW, "WorkerW", None)
# print("hwnd_WorkW: ",hwnd_WorkW)
if not hwnd_WorkW:
continue
hView = win32gui.FindWindowEx(hwnd_WorkW, None, "SHELLDLL_DefView", None)
# print('hwmd_hView: ', hView)
if not hView:#这个WorkerW下没有shell
continue
h = win32gui.FindWindowEx(None, hwnd_WorkW, "WorkerW", None)
while h:
win32gui.SendMessage(h, 0x0010, 0, 0) # WM_CLOSE
h = win32gui.FindWindowEx(None, hwnd_WorkW, "WorkerW", None)
break
return hwnd
下一步就是把你的窗口作为 Program Manage 的子窗体,你可以创建一个QVideoWidget来播放视频资源,通过vidiowidget.setGeometry(desktop.screenGeometry(i))来设置不同屏幕的展现方式
def setwallpaper(self):
if not self.path:
self.messageDialog("请选取一个视频文件")
return
desktop = QApplication.desktop()
screen_count = desktop.screenCount()
for i in range(screen_count):
h = self.gethandle()
self.__setattr__("vidiowidget_"+str(i),VideoWidget())
vidiowidget = self.__getattribute__("vidiowidget_"+str(i))
vidiowidget.setGeometry(desktop.screenGeometry(i))
# self.w.showFullScreen()
vidiowidget.show()
self.__setattr__("player_" + str(i), QMediaPlayer())
player = self.__getattribute__("player_"+str(i))
player.setNotifyInterval(10000)
player.setMuted(bool(1 - player.isMuted()))
player.setMedia(QMediaContent(QUrl(self.path)))
player.setVideoOutput(vidiowidget)
self.__setattr__("mplayList_" + str(i), QMediaPlaylist())
mplayList = self.__getattribute__("mplayList_"+str(i))
mplayList.addMedia(QMediaContent(QUrl.fromLocalFile(self.path)))
player.setPlaylist(mplayList)
mplayList.setPlaybackMode(QMediaPlaylist.CurrentItemInLoop)
# win32gui.SetParent(int(self.w.winId()),self.gethandle())
# win32gui.SetParent(int(vidiowidget.winId()), self.gethandle())
# win32gui.SetParent(int(vidiowidget.winId()), int(self.w.winId()))
video_h = int(vidiowidget.winId())
win_hwnd = int(self.w.winId())
# win32gui.SetParent(win_hwnd, h)
win32gui.SetParent(video_h, h)
# win32gui.SetParent(video_h, win_hwnd)
player.play()
知道原理实现起来就比较简单了,实现过程中可以使用spy++工具来帮助我们探测屏幕窗口
图是桌面的组成单元
最后
以上就是勤恳牛排为你收集整理的用python 制作windows动态视频桌面 可以多屏显示哦源码地址:https://github.com/starzc-galaxy/Dynamic-desktop.git的全部内容,希望文章能够帮你解决用python 制作windows动态视频桌面 可以多屏显示哦源码地址:https://github.com/starzc-galaxy/Dynamic-desktop.git所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复