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:
parent
0f555b1a3a
commit
6ed97f3ffa
|
|
@ -14,6 +14,28 @@ from typing import Optional, Dict, Any
|
||||||
if sys.platform == 'win32':
|
if sys.platform == 'win32':
|
||||||
import ctypes
|
import ctypes
|
||||||
from ctypes import wintypes
|
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 (
|
from PyQt6.QtWidgets import (
|
||||||
QApplication, QWidget, QVBoxLayout, QHBoxLayout,
|
QApplication, QWidget, QVBoxLayout, QHBoxLayout,
|
||||||
|
|
@ -124,10 +146,21 @@ class HUDOverlay(QWidget):
|
||||||
self._drag_offset = QPoint()
|
self._drag_offset = QPoint()
|
||||||
self._modifier_pressed = False
|
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
|
# Timer for session time updates
|
||||||
self._timer = QTimer(self)
|
self._timer = QTimer(self)
|
||||||
self._timer.timeout.connect(self._update_session_time)
|
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_window()
|
||||||
self._setup_ui()
|
self._setup_ui()
|
||||||
self._load_position()
|
self._load_position()
|
||||||
|
|
@ -609,6 +642,51 @@ class HUDOverlay(QWidget):
|
||||||
self._stats.session_time = datetime.now() - self._session_start
|
self._stats.session_time = datetime.now() - self._session_start
|
||||||
self._update_time_display()
|
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:
|
def _update_time_display(self) -> None:
|
||||||
"""Update the time label."""
|
"""Update the time label."""
|
||||||
total_seconds = int(self._stats.session_time.total_seconds())
|
total_seconds = int(self._stats.session_time.total_seconds())
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue