好友
阅读权限25
听众
最后登录1970-1-1
|
小时候玩电脑的时候,记得有个雪花桌面感觉挺好的,看着自己空荡荡的桌面,奈何买不起漂亮的动态,于是自己就简单的还原了一下当年的雪花桌面场景
....... 开启怀旧模式.
软件链接
https://www.lanzouq.com/iIpsy2utks6b
软件肯能会报毒哦,自己写的小程序,大家放心用,程序里面网注册列表里面写了开机启动,比较敏感,附上源码,大家也可大胆改造,复刻经典,实现自己的动态桌面哦
鼠标.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_())
大家也可以自定义自己的实现方式和效果改变源码,自己折腾
|
免费评分
-
查看全部评分
|