Я пытаюсь создать оверлей поверх игры с 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()