Прозрачный игровой оверлей Pyglet теряет фокус - PullRequest
0 голосов
/ 01 мая 2020

Я пытаюсь создать оверлей поверх игры с Pyglet. Этот пример работает для pygame, вы можете взаимодействовать с игрой, и pygame все еще dr aws в верхней части окна и в вашей игре. Используя pyglet, вы получаете прозрачный оверлей, но всякий раз, когда вы нажимаете на свою игру, вы теряете фокус вашего окна pyglet (что хорошо), и рисунки больше не отображаются поверх него. Есть ли способ решить эту проблему?

Я пробовал win32gui.BringWindowToTop(window._hwnd), который, к сожалению, не сработал.

#!/usr/bin/env python
import pyglet

import win32gui
import win32con
import win32api

from time import sleep
from pyglet import gl


rgb = lambda rgba: [x / 255.0 for x in rgba]


def get_game_window(hwnd_name="MyGame"):
    while True:
        try:
            hwnd = win32gui.FindWindow(None, hwnd_name)
            window_rect = win32gui.GetWindowRect(hwnd)
            x = window_rect[0] - 5
            y = window_rect[1]
            width = window_rect[2] - x
            height = window_rect[3] - y
            return x, y, width, height, hwnd
        except:
            pass
        sleep(0.5)


def create_overlay(game_window):
    window = pyglet.window.Window(
        game_window[2], game_window[3], vsync=0, style=pyglet.window.Window.WINDOW_STYLE_BORDERLESS
    )
    window.set_mouse_visible(False)
    win32gui.SetWindowLong(
        window._hwnd, win32con.GWL_EXSTYLE,
        win32gui.GetWindowLong(window._hwnd, win32con.GWL_EXSTYLE) | win32con.WS_EX_LAYERED
    )
    win32gui.SetLayeredWindowAttributes(window._hwnd, win32api.RGB(255, 0, 128), 0, win32con.LWA_COLORKEY)
    gl.glClearColor(*rgb((255, 0, 128, 0)))
    return window


def update(_, window, label):
    gl.glClearColor(*rgb((255, 0, 128, 0)))
    window.clear()
    label.draw()


def main():
    window = create_overlay(get_game_window())
    label = pyglet.text.Label('Hello, Overlay!',
                              font_name='Arial',
                              font_size=15,
                              x=window.width / 2,
                              y=window.height / 2,
                              anchor_x='center',
                              anchor_y='center')
    pyglet.clock.schedule_interval(update, .005, window=window, label=label)
    pyglet.app.run()


if __name__ == "__main__":
    main()
...