Pygame: permite que los clics pasen por la ventana

Estoy haciendo una ventana pseudo transparente en pygame con la intención de mostrar información variada como un “HUD”

La secuencia de comandos utiliza PIL para tomar una imagen del escritorio y usarla como fondo de la ventana.

Una versión simple:

import pygame as py from ctypes import windll import ImageGrab, Image SetWindowPos = windll.user32.SetWindowPos py.init() def get_image(): im = ImageGrab.grab((0,0,window_x,window_y)) mode = im.mode size = im.size data = im.tobytes() im = py.image.fromstring(data,size,mode) return im window_x = 1920 window_y = 100 background = py.Surface((window_x,window_y)) background.blit(get_image(),(0,0)) window_pos = (0,0) screen = py.display.set_mode((window_x,window_y),py.HWSURFACE|py.NOFRAME) SetWindowPos(py.display.get_wm_info()['window'],-1,0,0,0,0,0x0001) clock = py.time.Clock() done = False while not done: for event in py.event.get(): if event.type == py.QUIT: done = True screen.blit(background,(0,0)) py.display.flip() clock.tick(30) py.quit() 

Esto crea una ventana de Pygame en la parte superior de la pantalla.

Mi problema es que la ventana de Pygame bloquea cualquier interacción del mouse con cualquier cosa debajo de ella.

¿Hay alguna forma de permitir que los eventos del mouse se ignoren y pasen por la ventana, como por ejemplo, al hacer clic en el ícono de un escritorio, debajo de la ventana de Pygame?

Tendrá que hacer un poco de piratería adicional que está fuera de lo que PyGame le da. Debería ser posible representar el canvas de PyGame en otro marco de ventanas en Python y tratar de usar las características avanzadas de esa biblioteca para lograrlo.

En windows

Un ejemplo es wxWidgets. Como se describe en este hilo , que suena bastante similar a lo que está tratando de lograr, el usuario ha configurado una ventana en la que se puede hacer clic y es transparente.

También vea este otro Post de Stackoverflow que menciona cómo manejar la Prueba de Impacto en C #. Publicar el código de esa publicación aquí:

 protected override void WndProc(ref Message m) { if (m.Msg == (int)WM_NCHITTEST) m.Result = (IntPtr)HTTRANSPARENT; else base.WndProc(ref m); } 

Es posible realizar pruebas similares en Python utilizando las API de win32. Este es un fragmento de código Python que hace exactamente esto. Localice la parte donde el progtwigdor configura la callback para el evento (algo como win32con.WM_NCHITTEST: self.onChi, donde self.onChi es la callback).

Espero que esto te dé un punto de partida. Dudo que haya algo preparado que encuentres fuera de la caja, pero esto debería darte algunos consejos sobre qué buscar.