2
0
mirror of https://github.com/Thracky/GlosSI.git synced 2024-11-03 09:40:18 +00:00

SteamTarget: Better way to detect overlay opening / closing

Found out GameOverlayRenderer likes to post very specific messages
Now, instead of memory reading some value from some address, which changes in updates, examine the messagequeue of the process to get overlay status
This commit is contained in:
Peter Repukat 2017-02-12 22:40:18 +01:00
parent a616ddaedd
commit 79ced09dcf
2 changed files with 50 additions and 24 deletions

View File

@ -15,6 +15,8 @@ limitations under the License.
*/
#include "SteamTargetRenderer.h"
std::atomic<bool> SteamTargetRenderer::overlayOpen = false;
HHOOK SteamTargetRenderer::hook = nullptr;
SteamTargetRenderer::SteamTargetRenderer(int& argc, char** argv) : QApplication(argc, argv)
{
@ -61,10 +63,23 @@ SteamTargetRenderer::SteamTargetRenderer(int& argc, char** argv) : QApplication(
controllerThread.run();
QTimer::singleShot(2000, this, &SteamTargetRenderer::launchApp); // lets steam do its thing
if (hmodGameOverlayRenderer != nullptr)
{
//Hook MessageQueue to detect if overlay gets opened / closed
//Steam Posts a Message with 0x14FA / 0x14F7 when the overlay gets opened / closed
hook = SetWindowsHookEx(WH_GETMESSAGE, HookCallback, nullptr, GetCurrentThreadId());
}
}
SteamTargetRenderer::~SteamTargetRenderer()
{
if (hmodGameOverlayRenderer != nullptr)
{
UnhookWindowsHookEx(hook);
}
renderThread.join();
if (controllerThread.isRunning())
controllerThread.stop();
@ -81,13 +96,13 @@ void SteamTargetRenderer::stop()
QApplication::exit(0);
}
void SteamTargetRenderer::RunSfWindowLoop()
{
if (!bRunLoop)
return;
sfWindow.setActive(true);
sf::Clock reCheckControllerTimer;
bool focusSwitchNeeded = true;
if (bDrawOverlay)
@ -137,9 +152,8 @@ void SteamTargetRenderer::RunSfWindowLoop()
//Dirty hack to make the steamoverlay work properly and still keep Apps Controllerconfig when closing overlay.
//even if hooking steam, this ensures the overlay stays working
if (overlayPtr != NULL)
if (hmodGameOverlayRenderer != NULL)
{
char overlayOpen = *reinterpret_cast<char*>(overlayPtr);
if (overlayOpen)
{
if (!bNeedFocusSwitch)
@ -196,24 +210,12 @@ void SteamTargetRenderer::RunSfWindowLoop()
void SteamTargetRenderer::getSteamOverlay()
{
//TODO: switch to pattern scanning... this is madness.
#ifdef _AMD64_
hmodGameOverlayRenderer = GetModuleHandle(L"Gameoverlayrenderer64.dll");
hmodGameOverlayRenderer = GetModuleHandle(overlayModuleName);
if (hmodGameOverlayRenderer != nullptr)
{
std::cout << "GameOverlayrenderer64.dll found; Module at: 0x" << hmodGameOverlayRenderer << std::endl;
overlayPtr = reinterpret_cast<uint64_t*>(uint64_t(hmodGameOverlayRenderer) + 0x1365cc);
std::cout << overlayModuleName << " found; Module at: 0x" << hmodGameOverlayRenderer << std::endl;
}
#else
hmodGameOverlayRenderer = GetModuleHandle(L"Gameoverlayrenderer.dll");
if (hmodGameOverlayRenderer != nullptr)
{
std::cout << "GameOverlayrenderer.dll found; Module at: 0x" << hmodGameOverlayRenderer << std::endl;
overlayPtr = reinterpret_cast<uint32_t*>(uint32_t(hmodGameOverlayRenderer) + 0xEE828);
}
#endif
}
@ -320,6 +322,25 @@ void SteamTargetRenderer::loadLogo()
backgroundSprite.setPosition(sf::Vector2f(winSize.width / 2.f, winSize.height / 2.f));
}
LRESULT WINAPI SteamTargetRenderer::HookCallback(int nCode, WPARAM wParam, LPARAM lParam)
{
if (nCode >= 0)
{
PMSG msg = reinterpret_cast<PMSG>(lParam);
if (msg->message == 0x14FA) //Posted when the overlay gets opened
{
overlayOpen = true;
std::cout << "Overlay Opened!\n";
}
else if (msg->message == 0x14F7 || msg->message == 512)
{
overlayOpen = false;
std::cout << "Overlay closed!\n";
}
}
return CallNextHookEx(hook, nCode, wParam, lParam);
}
void SteamTargetRenderer::launchApp()
{
bool launchGame = false;
@ -423,5 +444,7 @@ void SteamTargetRenderer::checkSharedMem()
exit(0);
}
}
}

View File

@ -24,6 +24,7 @@ limitations under the License.
#include <iostream>
#include <thread>
#include <QApplication>
#include <QTimer>
#include <QProcess>
#include <QBuffer>
@ -32,10 +33,9 @@ limitations under the License.
#include <QSettings>
#include <QCoreApplication>
#include <QDir>
#include <psapi.h>
#include "VirtualControllerThread.h"
#include <QApplication>
class SteamTargetRenderer : public QApplication
{
@ -51,7 +51,6 @@ public:
private:
void stop();
void getSteamOverlay();
void RunSfWindowLoop();
@ -61,7 +60,7 @@ private:
void loadLogo();
bool bRunLoop = true;
std::atomic<bool> bRunLoop = true;
bool bDrawDebugEdges = false;
bool bDrawOverlay = true;
@ -74,12 +73,16 @@ private:
HWND consoleHwnd;
HMODULE hmodGameOverlayRenderer;
HMODULE hmodGameOverlayRenderer = nullptr;
#ifdef _AMD64_
uint64_t *overlayPtr = nullptr;
WCHAR* overlayModuleName = L"GameOverlayRenderer64.dll";
#else
uint32_t *overlayPtr = nullptr;
WCHAR* overlayModuleName = L"GameOverlayRenderer.dll";
#endif
static std::atomic<bool> overlayOpen;
static HHOOK hook;
static LRESULT WINAPI HookCallback(int nCode, WPARAM wParam, LPARAM lParam);
HWND hwForeGroundWindow = nullptr;
bool bNeedFocusSwitch = false;