使用python实现代码雨,动态壁纸(非视频)
前提:pip install pygame
pip install pywin32
import pygame
import random
import win32gui
import win32con
from time import sleep
import threading
_id_ = None
"""窗口名获取到句柄"""
def get_hwnd_from_name(name):
hWnd_list = []
win32gui.EnumWindows(lambda hWnd, param: param.append(hWnd), hWnd_list)
for hwnd in hWnd_list:
title = win32gui.GetWindowText(hwnd)
if title == name:
return hwnd
else:
continue
"""
FindWindow Porgman Program Manager
SendMessageTimeout 0x052C Message
向桌面窗口WorkerW下的 Porman Program Manager窗口发送 0x052C信息,分裂出新的WorkerW
"""
def pretreatmentHandle() -> int:
# hwnd = win32gui.FindWindow("Progman", "Program Manager")
Progman = win32gui.FindWindow("Progman", "Program Manager") # 查找PM窗口
win32gui.SendMessageTimeout(
Progman,
0x052C,
None,
None,
win32con.SMTO_NORMAL,
1000
) # 发送0x052c信息
WorkerW = None
Workerw_WorkerW = 0
while True:
# 查找PM的主窗口 WorkerW
WorkerW = win32gui.FindWindowEx(
None,
WorkerW,
"WorkerW",
None
)
print('WorkerW: ', WorkerW)
if WorkerW == 0:
continue
# 确认WorkerW下有SHELLDLL_DefView窗口
WorkerWhView = win32gui.FindWindowEx(
WorkerW,
None,
"SHELLDLL_DefView",
None
)
print('SHELLDLL_DefView: ', WorkerWhView)
if WorkerWhView == 0:
continue
else:
# 成功查找到WorkerW下的WorkerW窗口
Workerw_WorkerW = win32gui.FindWindowEx(
None,
WorkerW,
"WorkerW",
None
)
print('WorkerW -> WorkerW: ', Workerw_WorkerW)
break
# while h:
# win32gui.SendMessage(h, 0x0010, 0, 0) # WM_CLOSE
return Workerw_WorkerW
def FindIS(HWND) -> bool:
hWnd_list = []
win32gui.EnumWindows(lambda hWnd, param: param.append(hWnd), hWnd_list)
for hwdn in hWnd_list:
if HWND == int(hwdn):
return True
else:
return False
"""
查看视频窗口是否存在
"""
def Iscoderain(hwnd) -> bool:
hWnd_list = []
win32gui.EnumWindows(lambda hWnd, param: param.append(hWnd), hWnd_list)
try:
if hwnd in hWnd_list:
return True
else:
return False
except TypeError:
return False
"""
设置视频窗口至WorkerW窗口子窗口
"""
def set(WindowsTitle: str, SleepTime) -> None:
global _id_
while True:
_HWND = get_hwnd_from_name(WindowsTitle) # 获取视频窗口hwnd
if _HWND:
_id_ = _HWND
sleep(SleepTime)
win32gui.SetParent(_HWND, pretreatmentHandle()) # 设置子窗口
break
else:
continue
def aa():
code_hwnd=get_hwnd_from_name('pygame window')
pretreatmentHandle()
set('pygame window',1)
def coderain():
# 初始化pygame
pygame.init()
# 默认不全屏
fullscreen = False
# 窗口未全屏宽和高
WIDTH, HEIGHT = 2560, 1440
# WIDTH, HEIGHT = 1920, 1080
init_width, init_height = WIDTH, HEIGHT
# 字块大小,宽,高
suface_height = 18
# 字体大小
font_size = 20
# 创建一个窗口
screen = pygame.display.set_mode((init_width, init_height))
pygame.event.set_grab(True)
# 字体
font = pygame.font.Font(r'C:\Windows\Boot\Fonts\msyh_boot.ttf', font_size)#此处修改你电脑上的字体文件,
# 创建一个图像对象
bg_suface = pygame.Surface((init_width, init_height), flags=pygame.SRCALPHA)
pygame.Surface.convert(bg_suface)
bg_suface.fill(pygame.Color(0, 0, 0, 28))
# 用纯色填充背景
screen.fill((0, 0, 0))
# 显示的字符
letter = ['q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p', 'a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l', 'z', 'x', 'c',
'v', 'b', 'n', 'm']
# texts = [
# font.render(str(letter[i]), True, (0, 255, 0)) for i in range(26)
# ]
# 也可以替换成0 1 显示
texts = [
font.render('0',True,(0,255,0)),font.render('1',True,(0,255,0))
]
# 生成的列数
column = int(init_width / suface_height)
drops = [0 for i in range(column)]
aa()
while True:
# 按键检测
for event in pygame.event.get():
if event.type == pygame.QUIT:
# 接受到退出事件后退出
exit()
elif event.type == pygame.KEYDOWN:
# 按F11切换全屏,或窗口
if event.key == pygame.K_F11:
print("检测到按键F11")
fullscreen = not fullscreen
if fullscreen:
# 全屏效果,参数重设
size = init_width, init_height = pygame.display.list_modes()[0]
screen = pygame.display.set_mode(size, pygame.FULLSCREEN | pygame.HWSURFACE)
else:
init_width, init_height = WIDTH, HEIGHT
screen = pygame.display.set_mode((WIDTH, HEIGHT))
# 图像对象重新创建
bg_suface = pygame.Surface((init_width, init_height), flags=pygame.SRCALPHA)
pygame.Surface.convert(bg_suface)
bg_suface.fill(pygame.Color(0, 0, 0, 28))
column = int(init_width / suface_height)
drops = [0 for i in range(column)]
elif event.key == pygame.K_ESCAPE:
# 按ESC退出
exit()
# 延时
pygame.time.delay(30)
# 图像对象放到窗口的原点坐标上
screen.blit(bg_suface, (0, 0))
for i in range(len(drops)):
# 随机字符
text = random.choice(texts)
# 把字符画到该列的下雨的位置
screen.blit(text, (i * suface_height, drops[i]*suface_height))
# 更新下雨的坐标
drops[i] += 1
# 超过界面高度或随机数,下雨位置置0
if drops[i] * suface_height > init_height or random.random() > 0.95:
drops[i] = 0
# 更新画面
pygame.display.flip()
coderain()
#mainthread = threading.Thread(target=coderain)
#sonthread = threading.Thread(target=aa)
#mainthread.start()
#sonthread.start()