Phase 1a: focus spoofing + hook observability
Two problems surfaced in testing: (1) no way to tell whether the injected hook was actually the input source, and (2) the final design needs the tool window focused for Steam RPT capture, which would pause/silence games that react to focus loss. Both are addressed here. - Focus spoofing (hook/focus_spoof): find the game's main window, subclass it to rewrite/swallow WM_ACTIVATE/ACTIVATEAPP/NCACTIVATE/KILLFOCUS, and inline- hook GetForegroundWindow/GetActiveWindow/GetFocus to always report the game as active. The game keeps running and polling while unfocused. - Status back-channel (protocol v2): the DLL reports attached/focus-spoof flags, game pid/hwnd, a heartbeat, and a cumulative XInputGetState counter. The host overlay turns the counter into a live poll rate, so "is the hook working" is directly observable. - Synthetic test-input toggle in the host: forwards a known automated pattern (stick circle + periodic A) to prove forwarding independent of the physical pad. - hook_selftest extended to assert the status channel; passes. Documented the windowed/borderless requirement and the new observable test flow in the README. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -3,6 +3,7 @@
|
||||
#pragma once
|
||||
|
||||
#include <array>
|
||||
#include <cstdint>
|
||||
|
||||
#include "coop/protocol.hpp"
|
||||
#include "coop/shared_memory.hpp"
|
||||
@@ -11,6 +12,18 @@
|
||||
namespace coop
|
||||
{
|
||||
|
||||
// Plain (non-atomic) snapshot of the hook's back-channel for the overlay.
|
||||
struct HookStatusView
|
||||
{
|
||||
bool attached = false; // XInput hooks installed in the game
|
||||
bool focus_spoof = false; // focus spoofing active
|
||||
std::uint32_t heartbeat = 0; // DLL liveness counter
|
||||
std::uint64_t xinput_queries = 0;
|
||||
std::uint32_t game_pid = 0;
|
||||
std::uint64_t game_hwnd = 0;
|
||||
std::uint32_t last_user_index = 0;
|
||||
};
|
||||
|
||||
class IpcServer
|
||||
{
|
||||
public:
|
||||
@@ -23,6 +36,9 @@ public:
|
||||
|
||||
void stop();
|
||||
|
||||
// Reads the hook's diagnostics back-channel (zeroed if not started).
|
||||
[[nodiscard]] HookStatusView hook_status() const;
|
||||
|
||||
[[nodiscard]] bool running() const
|
||||
{
|
||||
return block_ != nullptr;
|
||||
|
||||
Reference in New Issue
Block a user