我是靠谱客的博主 勤恳牛排,最近开发中收集的这篇文章主要介绍用python 制作windows动态视频桌面 可以多屏显示哦源码地址:https://github.com/starzc-galaxy/Dynamic-desktop.git,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

源码地址: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所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(47)

评论列表共有 0 条评论

立即
投稿
返回
顶部