吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 4726|回复: 50
收起左侧

[Windows] python重现 怀旧雪花桌面 V 1.0.0

  [复制链接]
2025crj 发表于 2025-4-29 11:17
小时候玩电脑的时候,记得有个雪花桌面感觉挺好的,看着自己空荡荡的桌面,奈何买不起漂亮的动态,于是自己就简单的还原了一下当年的雪花桌面场景
....... 开启怀旧模式.
软件链接
https://www.lanzouq.com/iIpsy2utks6b


软件肯能会报毒哦,自己写的小程序,大家放心用,程序里面网注册列表里面写了开机启动,比较敏感,附上源码,大家也可大胆改造,复刻经典,实现自己的动态桌面哦

图片.png
鼠标.png  可以替换成自己喜欢的鼠标跟随图片   鼠标和雪花有简单的互动碰撞效果
图片.png
python源码
[Python] 纯文本查看 复制代码
import ctypes
import os
import random
import sys

from PyQt5.QtCore import Qt, QTimer, QPoint, QByteArray
from PyQt5.QtGui import QPainter, QColor, QPixmap, QCursor
from PyQt5.QtWidgets import QApplication, QWidget


# 新增:开机自动启动实现
def add_to_startup():
    """通过创建启动项实现开机自动启动"""
    try:
        import winshell
        from win32com.client import Dispatch
    except ImportError:
        print("请安装依赖库:pip install pywin32 winshell")
        return

    startup_folder = winshell.startup()  # 获取启动目录
    print("添加到启动项:", startup_folder)
    shortcut_path = os.path.join(startup_folder, "下雪.lnk")

    if not os.path.exists(shortcut_path):
        shell = Dispatch('WScript.Shell')
        shortcut = shell.CreateShortCut(shortcut_path)
        shortcut.Targetpath = sys.executable
        shortcut.Arguments = f'"{os.path.abspath(__file__)}"'
        shortcut.WorkingDirectory = os.path.dirname(__file__)
        shortcut.save()
        print("已添加到开机启动项")
    else:
        print("已存在开机启动项")


# 获取桌面窗口句柄并嵌入
def get_desktop_window():
    # 查找ProgMan窗口
    progman = ctypes.windll.user32.FindWindowW('ProgMan', None)
    # 发送0x052C消息生成WorkerW窗口
    ctypes.windll.user32.SendMessageW(progman, 0x052C, 0, 0)
    hwnd = ctypes.windll.user32.FindWindowExW(None, None, 'WorkerW', None)
    while hwnd:
        # 查找包含SHELLDLL_DefView的子窗口
        shell_view = ctypes.windll.user32.FindWindowExW(hwnd, None, 'SHELLDLL_DefView', None)
        if shell_view:
            return hwnd
        hwnd = ctypes.windll.user32.FindWindowExW(None, hwnd, 'WorkerW', None)
    return None


class Snowflake:
    def __init__(self, max_width, max_height):
        self.x = random.randint(0, max_width)
        self.y = random.randint(-max_height, 0)  # 雪花从屏幕上方随机位置生成
        self.vx = random.uniform(-1, 1)
        self.vy = random.uniform(0.5, 1.5)  # 向下飘落的速度
        self.radius = random.randint(5, 10)
        self.color = QColor(255, 255, 255, 200)  # 白色雪花
        # 加载雪花图片
        base64_icon2 = "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"
        icon_data2 = QByteArray.fromBase64(base64_icon2.encode())
        self.pixmap = QPixmap()
        self.pixmap.loadFromData(icon_data2)
        self.pixmap = self.pixmap.scaled(self.radius * 2, self.radius * 2, Qt.KeepAspectRatio, Qt.SmoothTransformation)

    def move(self, max_width, max_height, mouse_pos=None):
        # 如果有鼠标位置信息,检测雪花是否需要弹开
        if mouse_pos:
            mouse_x, mouse_y = mouse_pos
            distance = ((self.x - mouse_x) ** 2 + (self.y - mouse_y) ** 2) ** 0.5
            if distance < 100:  # 修改:增大鼠标影响范围阈值
                self.vx = (self.x - mouse_x) * 0.2  # 修改:增强弹开力度
                self.vy = -(self.y - mouse_y) * 0.2  # 修改:增强弹开力度
                self.x += self.vx * 3  # 修改:增强弹开力度
                self.y += self.vy * 3  # 修改:增强弹开力度
            else:
                self.x += self.vx
                self.y += self.vy
        else:
            self.x += self.vx
            self.y += self.vy

        # 判断是否到达地面或逃出边界
        if self.y >= max_height or self.x < 0 or self.x > max_width:
            return False  # 雪花需要销毁
        return True  # 雪花继续存在

    def draw(self, painter):
        # 使用图片绘制雪花
        # 修改:将 self.x 和 self.y 转换为整数类型
        painter.drawPixmap(QPoint(int(self.x - self.radius), int(self.y - self.radius)), self.pixmap)


class DynamicWallpaper(QWidget):
    def __init__(self):
        super().__init__()
        # 初始化窗口属性
        self.setWindowFlags(Qt.FramelessWindowHint | Qt.WindowTransparentForInput)
        self.setAttribute(Qt.WA_TranslucentBackground)
        self.setGeometry(0, 0, QApplication.desktop().screenGeometry().width(),
                         QApplication.desktop().screenGeometry().height())

        # 创建雪花
        self.snowflakes = [Snowflake(self.width(), self.height()) for _ in range(50)]  # 初始小雪
        # 定时器更新动画
        self.timer = QTimer(self)
        self.timer.timeout.connect(self.update_snowflakes)
        self.timer.start(30)

        # 新增:周期性调整雪花数量的定时器
        self.snow_timer = QTimer(self)
        self.snow_timer.timeout.connect(self.adjust_snow_amount)
        self.snow_timer.start(60000)  # 每分钟调整一次
        self.snow_state = 0  # 0: 小雪, 1: 大雪, 2: 暴雪, 3: 大雪, 4: 小雪

        # 嵌入到桌面窗口
        desktop_hwnd = get_desktop_window()
        if desktop_hwnd:
            self.winId()  # 确保窗口句柄存在
            ctypes.windll.user32.SetParent(int(self.windowHandle().winId()), desktop_hwnd)

        self.mouse_pos = None
        self.broom_pixmap = QPixmap("鼠标.png")
        self.broom_pixmap = self.broom_pixmap.scaled(150, 150, Qt.KeepAspectRatio, Qt.SmoothTransformation)

    def adjust_snow_amount(self):
        if self.snow_state == 0:
            # 小雪到大雪
            self.snowflakes.extend([Snowflake(self.width(), self.height()) for _ in range(50)])
            self.snow_state = 1
        elif self.snow_state == 1:
            # 大雪到暴雪
            self.snowflakes.extend([Snowflake(self.width(), self.height()) for _ in range(100)])
            self.snow_state = 2
        elif self.snow_state == 2:
            # 暴雪到大雪
            self.snowflakes = self.snowflakes[:150]
            self.snow_state = 3
        elif self.snow_state == 3:
            # 大雪到小雪
            self.snowflakes = self.snowflakes[:100]
            self.snow_state = 4
        elif self.snow_state == 4:
            # 小雪到小雪
            self.snowflakes = self.snowflakes[:50]
            self.snow_state = 0

    def update_snowflakes(self):
        for flake in self.snowflakes[:]:  # 使用切片复制列表以避免修改时迭代
            if not flake.move(self.width(), self.height(), self.mouse_pos):  # 如果雪花需要销毁
                self.snowflakes.remove(flake)  # 移除雪花
                self.snowflakes.append(Snowflake(self.width(), self.height()))  # 在顶部生成新的雪花
        self.update()  # 触发重绘

    def paintEvent(self, event):
        painter = QPainter(self)
        painter.setRenderHint(QPainter.Antialiasing)

        # 获取鼠标当前位置
        mouse_pos = QCursor.pos()
        mouse_pos = self.mapFromGlobal(mouse_pos)

        # 绘制雪花
        for flake in self.snowflakes:
            # 计算雪花与鼠标的距离
            distance = ((flake.x - mouse_pos.x()) ** 2 + (flake.y - mouse_pos.y()) ** 2) ** 0.5
            if distance < 60:  # 鼠标影响范围阈值
                # 调整雪花速度和位置,使其加速弹开
                flake.vx = (flake.x - mouse_pos.x()) * 0.2  # 增强弹开力度
                flake.vy = -(flake.y - mouse_pos.y()) * 0.2  # 增强弹开力度
                flake.x += flake.vx * 3  # 加速弹开
                flake.y += flake.vy * 3  # 加速弹开
                flake.color.setAlpha(255)  # 提高透明度

                # 强制激活雪花运动
                if abs(flake.vx) < 0.1 and abs(flake.vy) < 0.1:
                    flake.vx = random.uniform(-1, 1)  # 随机生成非零速度
                    flake.vy = random.uniform(0.5, 1.5)  # 随机生成非零速度
            else:
                flake.color.setAlpha(200)  # 其他时刻保持正常透明度

            # 绘制雪花
            flake.draw(painter)

        # 绘制所有雪花后,新增绘制扫把
        painter.drawPixmap(
            mouse_pos.x() - self.broom_pixmap.width() // 2 + 40,
            mouse_pos.y() + 20,  # 鼠标下方20像素位置
            self.broom_pixmap
        )

    # 新增:捕获鼠标移动事件
    def mouseMoveEvent(self, event):
        self.mouse_pos = (event.x(), event.y())


if __name__ == '__main__':
    add_to_startup()
    # 新增:检查互斥锁
    mutex = ctypes.windll.kernel32.CreateMutexW(None, True, "Local/SnowfallProgramMutex")
    if ctypes.windll.kernel32.GetLastError() == 0x00000010:
        print("检测到程序已在运行,即将退出...")
        sys.exit(-1)
    app = QApplication(sys.argv)
    w = DynamicWallpaper()
    w.show()
    sys.exit(app.exec_())


大家也可以自定义自己的实现方式和效果改变源码,自己折腾
图片.png

图片.png

图片.png

免费评分

参与人数 7吾爱币 +7 热心值 +7 收起 理由
8286638yy + 1 + 1 我很赞同!
nndyky + 1 + 1 鼓励转贴优秀软件安全工具和文档!
LYI + 1 + 1 鼓励转贴优秀软件安全工具和文档!
我是菜鸟我先灰 + 1 + 1 谢谢@Thanks!
freckle + 1 + 1 挺好玩的
SakuraYaaa + 1 + 1 热心回复!
ifend + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

freckle 发表于 2025-4-29 14:21

我的运行不了,是因为啥
Traceback (most recent call last):
  File "5.下雪.py", line 200, in <module>
  File "5.下雪.py", line 31, in add_to_startup
  File "<COMObject <unknown>>", line 2, in save
pywintypes.com_error: (-2147352567, '发生意外。', (0, 'WshShortcut.Save', '无法保存快捷方式“C:\\Users\\Administrator\\AppData\\Roaming\\Microsoft\\Windows\\Start Menu\\Programs\\Startup\\下雪.lnk”。', None, 0, -2147024891), None)
我是菜鸟我先灰 发表于 2025-4-29 22:46
当年用WIN7系统的时候,有一个下雪的屏保,那个时候的屏保还没有改动,屏保的时候还是可以看到桌面的,下雪屏保随着长时间的运行雪花会积累,落在桌面程序图标上也会有积雪,任务栏上也有,很有意思,后来从WIN8开始,屏保改了。。
yfl 发表于 2025-4-29 11:18
dlex007 发表于 2025-4-29 11:23
学习学习
wan_lei2008 发表于 2025-4-29 11:39
案例不错,感谢分享。
xtajtyq 发表于 2025-4-29 11:49
感觉不错,下来试试,谢谢分享。
jtjt68 发表于 2025-4-29 12:10
感谢发布原创作品
wzq7002 发表于 2025-4-29 12:44
有的意思
ydszzj 发表于 2025-4-29 12:48
看上去花里胡哨的,可是我喜欢
gyg1028 发表于 2025-4-29 13:52
怎么改雪花为其它形状啊,太喜欢了
飞悦0616 发表于 2025-4-29 14:08
真是不错啊,有源代码
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2025-7-8 17:08

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表