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:
@@ -21,15 +21,14 @@ public:
|
||||
|
||||
void draw();
|
||||
|
||||
// Forward the latest pad snapshot to the injected hook (if connected).
|
||||
void publish(const std::array<PadInfo, kMaxPads>& pads)
|
||||
{
|
||||
server_.publish(pads);
|
||||
}
|
||||
// Forward the latest pad snapshot to the injected hook (if connected). When
|
||||
// test-input mode is on, a synthetic pattern is sent instead of `pads`.
|
||||
void publish(const std::array<PadInfo, kMaxPads>& pads);
|
||||
|
||||
private:
|
||||
void refresh_processes();
|
||||
void inject_selected();
|
||||
void draw_hook_status();
|
||||
|
||||
std::vector<ProcessEntry> processes_;
|
||||
char filter_[128] = {};
|
||||
@@ -39,6 +38,13 @@ private:
|
||||
IpcServer server_;
|
||||
std::string status_;
|
||||
ImVec4 status_color_;
|
||||
|
||||
bool test_input_ = false;
|
||||
|
||||
// Sampled to turn the hook's cumulative query counter into a poll rate.
|
||||
unsigned long long last_query_count_ = 0;
|
||||
double last_sample_time_ = 0.0;
|
||||
double query_rate_ = 0.0;
|
||||
};
|
||||
|
||||
} // namespace coop
|
||||
|
||||
Reference in New Issue
Block a user