Pygame:允许点击穿过窗口

问题描述 投票:0回答:2

我正在 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 窗口下方的桌面图标。

python python-2.7 window pygame
2个回答
4
投票

这是一个老问题,但我已经遇到过好几次了,直到现在才让它正常工作。这是相关的部分。

import win32api
import win32con
import win32gui
import pygame

fuchsia = (255, 0, 128)  # Transparency color
hwnd = pygame.display.get_wm_info()["window"] # Handle
styles = win32gui.GetWindowLong(hwnd, win32con.GWL_EXSTYLE)
styles = styles | win32con.WS_EX_LAYERED | win32con.WS_EX_TRANSPARENT
win32gui.SetWindowLong(hwnd, win32con.GWL_EXSTYLE, styles)
win32gui.SetLayeredWindowAttributes(hwnd, win32api.RGB(*fuchsia), 0, win32con.LWA_COLORKEY)

2
投票

您将需要做一些额外的黑客工作,这超出了 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);
}

可以使用 win32 API 在 Python 中进行类似的测试。 这是一段 Python 代码,正是执行此操作。 找到程序员为事件设置回调的部分(类似于

win32con.WM_NCHITTEST: self.onChi,
,其中
self.onChi
是回调)。

我希望这能为您提供一个起点。我怀疑是否有任何现成的东西可以开箱即用,但这些应该会给你一些关于寻找什么的指导。

© www.soinside.com 2019 - 2024. All rights reserved.