feat(hud): add game window detection for auto-hide

- Detect when Entropia Universe window is in foreground
- Auto-hide HUD when game loses focus (optional, enabled by default)
- Add set_auto_hide_with_game() method to toggle behavior
- Uses Windows API: GetForegroundWindow, GetWindowText
This commit is contained in:
LemonNexus 2026-02-08 21:26:02 +00:00
parent 0f555b1a3a
commit 6ed97f3ffa
1 changed files with 78 additions and 0 deletions

View File

@ -14,6 +14,28 @@ from typing import Optional, Dict, Any
if sys.platform == 'win32':
import ctypes
from ctypes import wintypes
# Windows API constants for window detection
GW_OWNER = 4
# GetForegroundWindow function
user32 = ctypes.windll.user32
GetForegroundWindow = user32.GetForegroundWindow
GetForegroundWindow.restype = wintypes.HWND
# GetWindowText functions
GetWindowTextLengthW = user32.GetWindowTextLengthW
GetWindowTextLengthW.argtypes = [wintypes.HWND]
GetWindowTextLengthW.restype = ctypes.c_int
GetWindowTextW = user32.GetWindowTextW
GetWindowTextW.argtypes = [wintypes.HWND, wintypes.LPWSTR, ctypes.c_int]
GetWindowTextW.restype = ctypes.c_int
# FindWindow function
FindWindowW = user32.FindWindowW
FindWindowW.argtypes = [wintypes.LPCWSTR, wintypes.LPCWSTR]
FindWindowW.restype = wintypes.HWND
from PyQt6.QtWidgets import (
QApplication, QWidget, QVBoxLayout, QHBoxLayout,
@ -124,10 +146,21 @@ class HUDOverlay(QWidget):
self._drag_offset = QPoint()
self._modifier_pressed = False
# Game window detection
self._auto_hide_with_game = True # Auto-hide when game not focused
self._game_window_title = "Entropia Universe" # Window title to track
self._was_visible_before_unfocus = False
# Timer for session time updates
self._timer = QTimer(self)
self._timer.timeout.connect(self._update_session_time)
# Timer for game window detection (Windows only)
self._window_check_timer = QTimer(self)
self._window_check_timer.timeout.connect(self._check_game_window)
if sys.platform == 'win32':
self._window_check_timer.start(500) # Check every 500ms
self._setup_window()
self._setup_ui()
self._load_position()
@ -609,6 +642,51 @@ class HUDOverlay(QWidget):
self._stats.session_time = datetime.now() - self._session_start
self._update_time_display()
def _check_game_window(self) -> None:
"""
Check if Entropia Universe window is in foreground.
Auto-hide HUD when game is not focused (optional feature).
"""
if not self._auto_hide_with_game or sys.platform != 'win32':
return
try:
# Get foreground window title
hwnd = GetForegroundWindow()
if hwnd:
length = GetWindowTextLengthW(hwnd)
if length > 0:
buffer = ctypes.create_unicode_buffer(length + 1)
GetWindowTextW(hwnd, buffer, length + 1)
title = buffer.value
# Check if game is in foreground
is_game_focused = self._game_window_title in title
if is_game_focused:
# Game is focused - show HUD if it was hidden
if self._was_visible_before_unfocus and not self.isVisible():
self.show()
else:
# Game not focused - hide HUD if visible
if self.isVisible():
self._was_visible_before_unfocus = True
self.hide()
else:
self._was_visible_before_unfocus = False
except Exception:
# Silently ignore errors (e.g., Windows API issues)
pass
def set_auto_hide_with_game(self, enabled: bool) -> None:
"""
Enable/disable auto-hide when game not focused.
Args:
enabled: True to auto-hide HUD when game loses focus
"""
self._auto_hide_with_game = enabled
def _update_time_display(self) -> None:
"""Update the time label."""
total_seconds = int(self._stats.session_time.total_seconds())