From 6ecbd9d6560bb98c94d7db802751fe6f45eb5fd0 Mon Sep 17 00:00:00 2001 From: Peter Repukat Date: Sun, 17 Oct 2021 18:20:16 +0200 Subject: [PATCH] Support opening overlay even when windowe not focused --- GlosSITarget/SteamTarget.cpp | 60 +++++++++++++++++++++++++++++----- GlosSITarget/SteamTarget.h | 8 +++++ GlosSITarget/TargetWindow.h | 1 + GlosSITarget/steam_sf_keymap.h | 2 ++ 4 files changed, 62 insertions(+), 9 deletions(-) diff --git a/GlosSITarget/SteamTarget.cpp b/GlosSITarget/SteamTarget.cpp index a00fb21..6bcc1da 100644 --- a/GlosSITarget/SteamTarget.cpp +++ b/GlosSITarget/SteamTarget.cpp @@ -15,10 +15,14 @@ limitations under the License. */ #include "SteamTarget.h" -#include +#include "steam_sf_keymap.h" + +#include #include +#include +#include +#include #include -#include SteamTarget::SteamTarget(int argc, char *argv[]) : window_([this] { run_ = false; }), @@ -33,6 +37,7 @@ int SteamTarget::run() while (run_) { detector_.update(); window_.update(); + overlayHotkeyWorkaround(); } return 1; } @@ -42,7 +47,8 @@ void SteamTarget::onOverlayChanged(bool overlay_open) window_.setClickThrough(!overlay_open); if (overlay_open) { focusWindow(target_window_handle_); - } else { + } + else { focusWindow(last_foreground_window_); } } @@ -71,8 +77,7 @@ void SteamTarget::focusWindow(WindowHandle hndl) //try to forcefully set foreground window at least a few times sf::Clock clock; - while (!SetForegroundWindow(hndl) && clock.getElapsedTime().asMilliseconds() < 20) - { + while (!SetForegroundWindow(hndl) && clock.getElapsedTime().asMilliseconds() < 20) { SetActiveWindow(hndl); Sleep(1); } @@ -98,7 +103,7 @@ std::wstring SteamTarget::getSteamUserId() // TODO: check if keys/value exist // steam should always be open and have written reg values... winreg::RegKey key{HKEY_CURRENT_USER, L"SOFTWARE\\Valve\\Steam\\ActiveProcess"}; - return std::to_wstring( key.GetDwordValue(L"ActiveUser")); + return std::to_wstring(key.GetDwordValue(L"ActiveUser")); #else return L""; // TODO #endif @@ -119,13 +124,50 @@ std::vector SteamTarget::getOverlayHotkey() // has anyone more than 4 keys to open overlay?! std::smatch m; - if(!std::regex_match(hotkeys, m, std::regex(R"((.*?)\s*?(.*?)\s*?(.*?)\s*?(.*?))"))) { - return {"Shift", "Tab"}; + if (!std::regex_match(hotkeys, m, std::regex(R"((\w*)\s*(\w*)\s*(\w*)\s*(\w*))"))) { + return {"Shift", "KEY_TAB"}; } std::vector res; for (auto i = 1; i < m.size(); i++) { - res.emplace_back(m[i]); + const auto s = std::string(m[i]); + if (!s.empty()) { + res.push_back(s); + } } + spdlog::info("Detected Overlay hotkeys: {}", std::accumulate( + res.begin() + 1, res.end(), res[0], + [](auto acc, const auto curr) { return acc += "+" + curr; })); return res; } + +void SteamTarget::overlayHotkeyWorkaround() +{ + static bool pressed = false; + if (std::all_of(overlay_hotkey_.begin(), overlay_hotkey_.end(), + [](const auto &key) { + return sf::Keyboard::isKeyPressed(keymap::sfkey[key]); + })) { + pressed = true; + std::for_each( + overlay_hotkey_.begin(), overlay_hotkey_.end(), [this](const auto &key) { +#ifdef _WIN32 + PostMessage(target_window_handle_, WM_KEYDOWN, keymap::winkey[key], 0); +#else + +#endif + }); + spdlog::debug("Sending Overlay KeyDown events..."); + } else if (pressed) { + pressed = false; + std::for_each( + overlay_hotkey_.begin(), overlay_hotkey_.end(), [this](const auto &key) { +#ifdef _WIN32 + PostMessage(target_window_handle_, WM_KEYUP, keymap::winkey[key], 0); +#else + +#endif + }); + spdlog::debug("Sending Overlay KeyUp events..."); + } +} diff --git a/GlosSITarget/SteamTarget.h b/GlosSITarget/SteamTarget.h index f281c12..d46ef0f 100644 --- a/GlosSITarget/SteamTarget.h +++ b/GlosSITarget/SteamTarget.h @@ -31,6 +31,14 @@ class SteamTarget { std::wstring getSteamUserId(); std::vector getOverlayHotkey(); + /* + * Run once per frame + * detects steam configured overlay hotkey, and simulates key presses to window + * + * actually opens the overlay, even if window is not currently focused. + */ + void overlayHotkeyWorkaround(); + bool run_ = false; std::vector overlay_hotkey_ = getOverlayHotkey(); diff --git a/GlosSITarget/TargetWindow.h b/GlosSITarget/TargetWindow.h index f68ce6f..620badb 100644 --- a/GlosSITarget/TargetWindow.h +++ b/GlosSITarget/TargetWindow.h @@ -18,6 +18,7 @@ limitations under the License. #include +// Redfine window handle, should impl. change #ifdef _WIN32 #include using WindowHandle = HWND; diff --git a/GlosSITarget/steam_sf_keymap.h b/GlosSITarget/steam_sf_keymap.h index b461e5a..8f6728d 100644 --- a/GlosSITarget/steam_sf_keymap.h +++ b/GlosSITarget/steam_sf_keymap.h @@ -19,6 +19,7 @@ std::unordered_map sfkey = { {"Space", sf::Keyboard::Key::Space}, {"Backspace", sf::Keyboard::Key::Backspace}, {"Enter", sf::Keyboard::Key::Enter}, + {"KEY_TAB", sf::Keyboard::Key::Tab}, // TODO: more special keys with keylayout mapping... nope.. {"KEY_0", sf::Keyboard::Key::Num0}, {"KEY_1", sf::Keyboard::Key::Num1}, @@ -72,6 +73,7 @@ std::unordered_map winkey = { {"Space", VK_SPACE}, {"Backspace", VK_BACK}, {"Enter", VK_RETURN}, + {"KEY_TAB", VK_TAB}, // TODO: more special keys with keylayout mapping... nope.. {"KEY_0", 0x30}, {"KEY_1", 0x31},