// Makes the injected game believe it always has foreground focus, so it keeps // running and polling input while the tool's window holds the real OS focus // (required for Steam RPT to capture the tool). Without this, games that pause // or stop polling on focus loss are unusable in the final design. #pragma once #include "ipc_client.hpp" namespace coop::hook { // Finds the game's main window, subclasses it to suppress deactivation messages, // and hooks the focus-query APIs to always report the game as active. Returns // true once spoofing is active; safe to retry until the window exists. Reports // status through `ipc`. bool install_focus_spoof(IpcClient& ipc); // Reports how the game currently reads input (Raw Input gamepad usage + sink // flag, DirectInput presence) so the host can identify a focus-gated path. Cheap // to call each tick. void update_input_diagnostics(IpcClient& ipc); // While the focus subsystem is installed, free the operator's mouse each tick if the // host requested cursor release (covers games that ClipCursor once rather than every // frame, and a runtime toggle from clip -> release). No-op when clipping is allowed. void release_cursor_tick(); // Restores the original window procedure and removes the focus API hooks. void remove_focus_spoof(); } // namespace coop::hook