一、屏幕杀手优化了之后相比原来温柔了一点可以把亮度调低尝试运行,Esc退出importwin32guiimportwin32apiimportwin32conimportrandomimportctypesimportcolorsysimporttime# 获取屏幕尺寸并启用高DPI支持user32ctypes.windll.user32 user32.SetProcessDPIAware()swuser32.GetSystemMetrics(0)shuser32.GetSystemMetrics(1)color0print(屏幕扭曲特效运行中按 ESC 键安全退出)# 【新增】启动提示try:whileTrue:# 【新增】检测 ESC 键虚拟键码 27是否被按下按下则跳出循环ifwin32api.GetAsyncKeyState(27)0x8000:break# 获取整个屏幕的DC设备上下文hdcwin32gui.GetDC(0)# 将色调color转换为RGB颜色rgb_colorcolorsys.hsv_to_rgb(color,1.0,1.0)brushwin32gui.CreateSolidBrush(win32api.RGB(int(rgb_color[0]*255),int(rgb_color[1]*255),int(rgb_color[2]*255)))win32gui.SelectObject(hdc,brush)# 关键特效轻微晃动并反转颜色win32gui.BitBlt(hdc,random.randint(-10,10),random.randint(-10,10),sw,sh,hdc,0,0,win32con.SRCCOPY,)win32gui.BitBlt(hdc,random.randint(-10,10),random.randint(-10,10),sw,sh,hdc,0,0,win32con.PATINVERT,)# 释放 GDI 资源win32gui.DeleteObject(brush)# 释放屏幕 DCwin32gui.ReleaseDC(0,hdc)# 控制循环频率time.sleep(0.05)# 色调递增实现颜色循环color0.05ifcolor1.0:color0.0# 捕获 CtrlC 或 ESC 退出时的异常exceptKeyboardInterrupt:passfinally:# 【新增】统一在退出时打印安全提示print(\n程序已安全退出。)二、黑白方格也就是马赛克Esc退出importwin32guiimportwin32conimportwin32apiimportctypesimporttimeimportrandom# 获取屏幕尺寸user32ctypes.windll.user32 user32.SetProcessDPIAware()swuser32.GetSystemMetrics(0)shuser32.GetSystemMetrics(1)# 方格行数与列数ROWS,COLS77,99cell_wsw//COLS cell_hsh//ROWSprint(f全屏{ROWS}x{COLS}黑白格闪烁极致优化版按 ESC 退出)# 【优化 1】在循环外获取屏幕 DC并一次性创建内存 DC 和位图hdcwin32gui.GetDC(0)memDCwin32gui.CreateCompatibleDC(hdc)bmpwin32gui.CreateCompatibleBitmap(hdc,sw,sh)win32gui.SelectObject(memDC,bmp)# 【优化 2】提前获取系统内置的黑白画刷无需手动创建和销毁性能极高black_brushwin32gui.GetStockObject(win32con.BLACK_BRUSH)white_brushwin32gui.GetStockObject(win32con.WHITE_BRUSH)try:whileTrue:# 遍历所有格子进行绘制forrowinrange(ROWS):forcolinrange(COLS):xcol*cell_w yrow*cell_h rect(x,y,xcell_w,ycell_h)# 随机选择黑白画刷并填充矩形ifrandom.randint(0,1)0:win32gui.FillRect(memDC,rect,black_brush)else:win32gui.FillRect(memDC,rect,white_brush)# 将内存画布一次性刷新到屏幕win32gui.BitBlt(hdc,0,0,sw,sh,memDC,0,0,win32con.SRCCOPY)# 检测 ESC 退出放在渲染后减少每帧的 API 调用次数ifwin32api.GetAsyncKeyState(27)0x8000:breaktime.sleep(0.1)exceptKeyboardInterrupt:passfinally:# 【优化 3】程序退出时统一清理所有 GDI 资源cwin32gui.DeleteObject(bmp)win32gui.DeleteDC(memDC)win32gui.ReleaseDC(0,hdc)print(\n程序已安全退出资源已清理。)三、屏幕融化有点像漏液的感觉Esc退出importwin32guiimportwin32conimportwin32apiimportrandomimportctypesimporttimeimportmathimportcolorsys user32ctypes.windll.user32 user32.SetProcessDPIAware()swuser32.GetSystemMetrics(0)shuser32.GetSystemMetrics(1)offsets[0]*sw hue0print(彩色融化按 ESC 退出)whileTrue:ifwin32api.GetAsyncKeyState(27)0x8000:breakhdcwin32gui.GetDC(0)# 随机选择列偏移幅度加大2~8像素for_inrange(80):xrandom.randint(0,sw-1)offsets[x]min(offsets[x]random.randint(2,8),sh)# 更新色调使颜色循环hue(hue0.02)%1.0# 将 HSL 转为 RGBr,g,b[int(c*255)forcincolorsys.hsv_to_rgb(hue,0.9,0.8)]forxinrange(sw):ifoffsets[x]0:# 复制下移拖尾win32gui.BitBlt(hdc,x,offsets[x],1,sh-offsets[x],hdc,x,0,win32con.SRCCOPY)# 顶部填充当前颜色而不是黑色brushwin32gui.CreateSolidBrush(win32api.RGB(r,g,b))win32gui.SelectObject(hdc,brush)win32gui.PatBlt(hdc,x,0,1,offsets[x],win32con.PATCOPY# 使用画刷填充)win32gui.DeleteObject(brush)win32gui.ReleaseDC(0,hdc)time.sleep(0.03)# 控制速度反弹光环碰到屏幕边缘反弹importwin32guiimportwin32conimportwin32apiimportmathimportctypesimporttimeimportrandom# 获取屏幕尺寸user32ctypes.windll.user32 user32.SetProcessDPIAware()swuser32.GetSystemMetrics(0)shuser32.GetSystemMetrics(1)# 窗口过程defwnd_proc(hwnd,msg,w_param,l_param):ifmsgwin32con.WM_DESTROY:win32gui.PostQuitMessage(0)return0returnwin32gui.DefWindowProc(hwnd,msg,w_param,l_param)# 注册窗口类wcwin32gui.WNDCLASS()wc.lpfnWndProcwnd_proc wc.hInstancewin32api.GetModuleHandle(None)wc.lpszClassNameGlowRingOverlayclass_atomwin32gui.RegisterClass(wc)# 创建分层窗口使用透明色键hwndwin32gui.CreateWindowEx(win32con.WS_EX_TOPMOST|win32con.WS_EX_LAYERED|win32con.WS_EX_TRANSPARENT,class_atom,GlowOverlay,win32con.WS_POPUP|win32con.WS_VISIBLE,0,0,sw,sh,0,0,0,None)# 设置透明色键黑色 (0,0,0) 变为透明win32gui.SetLayeredWindowAttributes(hwnd,win32api.RGB(0,0,0),0,win32con.LWA_COLORKEY)# 创建内存 DC 和位图普通 24 位即可hdc_screenwin32gui.GetDC(0)memDCwin32gui.CreateCompatibleDC(hdc_screen)bmpwin32gui.CreateCompatibleBitmap(hdc_screen,sw,sh)win32gui.SelectObject(memDC,bmp)# 光环类仅绘制彩色圆环背景黑色classGlowRing:def__init__(self,x,y,radius,vx,vy):self.x,self.y,self.rx,y,radius self.vx,self.vyvx,vy self.inner_color(255,255,255)self.outer_color(255,215,0)# 预计算画笔无Alphaself.pens[]foriinrange(60):ti/60brightnessmath.sin(t*math.pi)**1.0ifbrightness0.01:continuerint(self.inner_color[0](self.outer_color[0]-self.inner_color[0])*t)gint(self.inner_color[1](self.outer_color[1]-self.inner_color[1])*t)bint(self.inner_color[2](self.outer_color[2]-self.inner_color[2])*t)r,g,bint(r*brightness),int(g*brightness),int(b*brightness)penwin32gui.CreatePen(win32con.PS_SOLID,1,win32api.RGB(r,g,b))self.pens.append(pen)self.radius_steps[0.10.9*(i/60)foriinrange(60)ifmath.sin(i/60*math.pi)0.01]defupdate(self):self.xself.vx self.yself.vyifself.x-self.r0orself.xself.rsw:self.vx-self.vxifself.y-self.r0orself.yself.rsh:self.vy-self.vydefdraw(self,hdc):win32gui.SelectObject(hdc,win32gui.GetStockObject(win32con.NULL_BRUSH))foridx,peninenumerate(self.pens):tidx/60radiusself.r*(0.10.9*t)win32gui.SelectObject(hdc,pen)leftint(self.x-radius)topint(self.y-radius)rightint(self.xradius)bottomint(self.yradius)win32gui.Ellipse(hdc,left,top,right,bottom)# 初始化 9 个光环速度提高rings[]for_inrange(9):# 1. 随机生成圆环的半径大小介于 60 到 130 像素之间radiusrandom.randint(99,135)# 2. 随机生成圆环的初始 X 坐标# 范围限制在 [radius, 屏幕宽度 - radius] 之间# 这样可以确保圆环在生成时其边缘不会超出屏幕的左右边界xrandom.randint(radius,sw-radius)# 3. 随机生成圆环的初始 Y 坐标# 同样限制在 [radius, 屏幕高度 - radius] 之间防止超出屏幕上下边界yrandom.randint(radius,sh-radius)# 4. 随机生成圆环的运动方向角介于 0 到 2π 弧度即 0° 到 360° 的任意方向anglerandom.uniform(0,2*math.pi)# 5. 随机生成圆环的运动速率介于 3.0 到 6.0 之间# 这里的 speed 是标量只有大小没有方向speedrandom.uniform(3.0,6.0)# 6. 利用三角函数将标量速度分解为 X 轴和 Y 轴的分速度向量# cos(angle) 决定了水平方向的移动比例sin(angle) 决定了垂直方向的移动比例vxspeed*math.cos(angle)vyspeed*math.sin(angle)# 7. 使用上面生成的所有属性坐标、半径、X/Y速度实例化一个 GlowRing 对象# 并将其添加到 rings 列表中以便在主循环中进行统一的绘制和更新rings.append(GlowRing(x,y,radius,vx,vy))print(✨ 透明窗口光环黑色透明已启动按 ESC 退出)try:whileTrue:win32gui.PumpWaitingMessages()ifwin32api.GetAsyncKeyState(27)0x8000:break# 清空为黑色将被视为透明win32gui.PatBlt(memDC,0,0,sw,sh,win32con.BLACKNESS)forringinrings:ring.draw(memDC)ring.update()# 将内存 DC 内容绘制到窗口窗口本身已透明色键# 使用 BitBlt 直接绘制到窗口 DC不行分层窗口需要 UpdateLayeredWindow 或直接绘制。# 对于设置了 LWA_COLORKEY 的窗口可以直接用 BitBlt 绘制黑色会透明。# 但是直接绘制到窗口 DC 可能导致闪烁我们仍使用双缓冲把内存 DC 内容 BitBlt 到窗口 DC。hdc_winwin32gui.GetDC(hwnd)win32gui.BitBlt(hdc_win,0,0,sw,sh,memDC,0,0,win32con.SRCCOPY)win32gui.ReleaseDC(hwnd,hdc_win)time.sleep(0.02)# 约 50 FPSexceptKeyboardInterrupt:passfinally:forringinrings:forpeninring.pens:win32gui.DeleteObject(pen)win32gui.DeleteObject(bmp)win32gui.DeleteDC(memDC)win32gui.ReleaseDC(0,hdc_screen)win32gui.DestroyWindow(hwnd)print(\n✅ 程序已退出。)注本文涉及的代码参考了开源项目https://github.com/Leo-Aqua/Python-gdi-repo需要安装的库有win32与pillow等只能在window系统上运行。