Pygame: разрешить кликам проходить через окно

Я делаю псевдо-прозрачное окно в pygame с целью отображения различной информации, такой как"HUD"

скрипт использует PIL для захвата изображения рабочего стола и использования его в качестве фона окна.

простой вариант:

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()

это создает окно Pygame в верхней части экрана.

моя проблема в том, что окно Pygame блокирует любое взаимодействие мыши с чем-либо под ним.

есть ли способ разрешить события мыши должны игнорироваться и проходить "через" окно, например, щелчок по значку рабочего стола под окном Pygame.

1 ответов


вам нужно будет сделать немного дополнительного взлома, который находится вне того, что PyGame дает вам. Должно быть возможно отобразить холст PyGame в другую оконную структуру в Python и попытаться использовать расширенные функции этой библиотеки для достижения этого.

В Windows

одним из примеров является wxWidgets. как описано в этой теме, что звучит очень похоже на то, что вы пытаетесь достичь, пользователь имеет окно настройки, которое можно щелкнуть и прозрачный.

Также см. Это еще один пост Stackoverflow в котором упоминается, как обрабатывать тестирование попадания в C#. Код проводки с этого поста здесь:

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

можно сделать подобное тестирование в Python с помощью win32 API. это фрагмент кода Python, который делает именно это. найдите часть, где программист настраивает обратный вызов для события (что-то вроде win32con.WM_NCHITTEST: self.onChi, здесь self.onChi - это обратного вызова).

Я надеюсь, что это дает вам отправную точку. Я сомневаюсь, что есть что-то готовое, что вы найдете из коробки, но это должно дать вам некоторые указания на то, что искать.