From 894300b6f4a9e32be113adbe7063861abedec3f7 Mon Sep 17 00:00:00 2001 From: Nemirtingas Date: Fri, 11 Oct 2019 00:32:36 +0200 Subject: [PATCH] Process raw mouse events Some games doesn't use the window proc to get the mouse events (ETS2), but it checks for raw mouse inputs. --- overlay_experimental/windows/Windows_Hook.cpp | 43 ++++++++++++++++--- 1 file changed, 36 insertions(+), 7 deletions(-) diff --git a/overlay_experimental/windows/Windows_Hook.cpp b/overlay_experimental/windows/Windows_Hook.cpp index 2d98f28..40dea26 100644 --- a/overlay_experimental/windows/Windows_Hook.cpp +++ b/overlay_experimental/windows/Windows_Hook.cpp @@ -95,6 +95,25 @@ bool IgnoreMsg(UINT uMsg) return false; } +void RawMouseEvent(RAWINPUT& raw) +{ + if (raw.header.dwType == RIM_TYPEMOUSE) + { + if (raw.data.mouse.usButtonFlags & RI_MOUSE_LEFT_BUTTON_DOWN) + ImGui_ImplWin32_WndProcHandler(Windows_Hook::Inst()->GetGameHwnd(), WM_LBUTTONDOWN, 0, 0); + else if (raw.data.mouse.usButtonFlags & RI_MOUSE_LEFT_BUTTON_UP) + ImGui_ImplWin32_WndProcHandler(Windows_Hook::Inst()->GetGameHwnd(), WM_LBUTTONUP, 0, 0); + else if (raw.data.mouse.usButtonFlags & RI_MOUSE_MIDDLE_BUTTON_DOWN) + ImGui_ImplWin32_WndProcHandler(Windows_Hook::Inst()->GetGameHwnd(), WM_MBUTTONDOWN, 0, 0); + else if (raw.data.mouse.usButtonFlags & RI_MOUSE_MIDDLE_BUTTON_UP) + ImGui_ImplWin32_WndProcHandler(Windows_Hook::Inst()->GetGameHwnd(), WM_MBUTTONUP, 0, 0); + else if (raw.data.mouse.usButtonFlags & RI_MOUSE_RIGHT_BUTTON_DOWN) + ImGui_ImplWin32_WndProcHandler(Windows_Hook::Inst()->GetGameHwnd(), WM_RBUTTONDOWN, 0, 0); + else if (raw.data.mouse.usButtonFlags & RI_MOUSE_RIGHT_BUTTON_UP) + ImGui_ImplWin32_WndProcHandler(Windows_Hook::Inst()->GetGameHwnd(), WM_RBUTTONUP, 0, 0); + } +} + LRESULT CALLBACK Windows_Hook::HookWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { Steam_Overlay* overlay = get_steam_client()->steam_overlay; @@ -108,9 +127,8 @@ LRESULT CALLBACK Windows_Hook::HookWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, // If Left Shift is pressed if (GetAsyncKeyState(VK_LSHIFT) & (1 << 15)) { - overlay->ShowOverlay(!overlay->ShowOverlay()); - if (overlay->ShowOverlay()) - show = true; + show = !overlay->ShowOverlay(); + overlay->ShowOverlay(show); } } } @@ -128,18 +146,29 @@ LRESULT CALLBACK Windows_Hook::HookWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, UINT WINAPI Windows_Hook::MyGetRawInputBuffer(PRAWINPUT pData, PUINT pcbSize, UINT cbSizeHeader) { - if (!get_steam_client()->steam_overlay->ShowOverlay()) + if (pData == nullptr || !get_steam_client()->steam_overlay->ShowOverlay()) return Windows_Hook::Inst()->GetRawInputBuffer(pData, pcbSize, cbSizeHeader); - return -1; + int num = Windows_Hook::Inst()->GetRawInputBuffer(pData, pcbSize, cbSizeHeader); + for (int i = 0; i < num; ++i) + RawMouseEvent(pData[i]); + + return 0; } UINT WINAPI Windows_Hook::MyGetRawInputData(HRAWINPUT hRawInput, UINT uiCommand, LPVOID pData, PUINT pcbSize, UINT cbSizeHeader) { - if (!get_steam_client()->steam_overlay->ShowOverlay()) + if (pData == nullptr || !get_steam_client()->steam_overlay->ShowOverlay()) return Windows_Hook::Inst()->GetRawInputData(hRawInput, uiCommand, pData, pcbSize, cbSizeHeader); - return -1; + Windows_Hook::Inst()->GetRawInputData(hRawInput, uiCommand, pData, pcbSize, cbSizeHeader); + + RawMouseEvent(*reinterpret_cast(pData)); + + //memset(pData, 0, *pcbSize); + *pcbSize = 0; + + return 0; } /////////////////////////////////////////////////////////////////////////////////////