如何让Pygame透明窗口正常接收并阻断鼠标点击穿透到后方窗口
问题根源
你修改参数不生效、鼠标点击穿透的问题来自两个原因:
- 调用
SetLayeredWindowAttributes时使用了win32con.LWA_COLORKEY标志位,该模式下函数的第三个参数(透明度alpha值)会被完全忽略,仅你指定的RGB色值会被设为完全透明 - Win32系统默认会将颜色键对应的完全透明像素区域的鼠标事件透给下层窗口,仅非透明像素区域能响应鼠标事件
解决方案
你可以同时开启颜色键和全局alpha两个标志位,既保留笔触外完全透明的视觉效果,又避免鼠标点击穿透:
- 将
SetLayeredWindowAttributes的最后一个参数修改为两个标志位的或值:win32con.LWA_COLORKEY | win32con.LWA_ALPHA - 第三个参数alpha值设置为254(取值范围0-255,254几乎完全透明,人眼很难识别出和完全透明的差异,只要该值不为0即可阻止点击穿透)
修改后参考代码
import pygame import win32gui import win32con import win32api ... temp = pygame.display.Info() self.screen_res = (temp.current_w, temp.current_h) pygame.display.set_caption("Main") # 可以加pygame.NOFRAME去掉窗口边框,更适合全屏绘图场景 screen = pygame.display.set_mode((self.screen_res[0], self.screen_res[1]), pygame.FULLSCREEN | pygame.NOFRAME) hwnd = pygame.display.get_wm_info()["window"] win32gui.SetWindowLong(hwnd, win32con.GWL_EXSTYLE, win32gui.GetWindowLong(hwnd, win32con.GWL_EXSTYLE) | win32con.WS_EX_LAYERED) # 修改后的SetLayeredWindowAttributes调用 win32gui.SetLayeredWindowAttributes(hwnd, win32api.RGB(*(0, 0, 0)), 254, win32con.LWA_COLORKEY | win32con.LWA_ALPHA) gameRun = True while gameRun: for event in pygame.event.get(): if event.type == pygame.QUIT: gameRun = False # 全窗口都可以正常响应鼠标事件,不需要担心透明区域穿透 if event.type == pygame.MOUSEBUTTONDOWN: print("接收到鼠标点击", event.pos) screen.fill((0, 0, 0)) # 此处绘制你的笔触内容即可,只要颜色不是(0,0,0)就会正常显示 pygame.display.update() pygame.display.quit() ...
补充说明
如果对透明度要求不高,也可以仅保留LWA_ALPHA标志位,去掉色键设置,直接填充半透明背景即可,同样可以正常响应全窗口鼠标事件。
内容的提问来源于stack exchange,提问作者I Like Python
相关产品推荐
相关产品推荐

