From 79548888d414d658b107c3318215bf322ce5fecd Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 16 Dec 2024 00:43:57 +0100 Subject: [PATCH] #367 hook SetWindowPlacement / Fix windowed mode --- inc/hook.h | 4 +++- inc/winapi_hooks.h | 1 + src/hook.c | 2 ++ src/winapi_hooks.c | 11 +++++++++++ 4 files changed, 17 insertions(+), 1 deletion(-) diff --git a/inc/hook.h b/inc/hook.h index e17e1ec..dac2704 100644 --- a/inc/hook.h +++ b/inc/hook.h @@ -16,7 +16,7 @@ typedef struct HOOKLISTDATA { HMODULE mod; } HOOKLISTDATA; -typedef struct HOOKLIST { char module_name[32]; HOOKLISTDATA data[34]; } HOOKLIST; +typedef struct HOOKLIST { char module_name[32]; HOOKLISTDATA data[35]; } HOOKLIST; typedef BOOL(WINAPI* GETCURSORPOSPROC)(LPPOINT); typedef BOOL(WINAPI* CLIPCURSORPROC)(const RECT*); @@ -57,6 +57,7 @@ typedef HHOOK(WINAPI* SETWINDOWSHOOKEXAPROC)(int, HOOKPROC, HINSTANCE, DWORD); typedef BOOL(WINAPI* PEEKMESSAGEAPROC)(LPMSG, HWND, UINT, UINT, UINT); typedef BOOL(WINAPI* GETMESSAGEAPROC)(LPMSG, HWND, UINT, UINT); typedef BOOL(WINAPI* GETWINDOWPLACEMENTPROC)(HWND, WINDOWPLACEMENT*); +typedef BOOL(WINAPI* SETWINDOWPLACEMENTPROC)(HWND, const WINDOWPLACEMENT*); typedef BOOL(WINAPI* ENUMDISPLAYSETTINGSAPROC)(LPCSTR, DWORD, DEVMODEA*); typedef SHORT(WINAPI* GETKEYSTATEPROC)(int); typedef SHORT(WINAPI* GETASYNCKEYSTATEPROC)(int); @@ -114,6 +115,7 @@ extern SETWINDOWSHOOKEXAPROC real_SetWindowsHookExA; extern PEEKMESSAGEAPROC real_PeekMessageA; extern GETMESSAGEAPROC real_GetMessageA; extern GETWINDOWPLACEMENTPROC real_GetWindowPlacement; +extern SETWINDOWPLACEMENTPROC real_SetWindowPlacement; extern ENUMDISPLAYSETTINGSAPROC real_EnumDisplaySettingsA; extern GETKEYSTATEPROC real_GetKeyState; extern GETASYNCKEYSTATEPROC real_GetAsyncKeyState; diff --git a/inc/winapi_hooks.h b/inc/winapi_hooks.h index 6bb5250..16a45bb 100644 --- a/inc/winapi_hooks.h +++ b/inc/winapi_hooks.h @@ -33,6 +33,7 @@ HHOOK WINAPI fake_SetWindowsHookExA(int idHook, HOOKPROC lpfn, HINSTANCE hmod, D BOOL WINAPI fake_PeekMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax, UINT wRemoveMsg); BOOL WINAPI fake_GetMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax); BOOL WINAPI fake_GetWindowPlacement(HWND hWnd, WINDOWPLACEMENT* lpwndpl); +BOOL WINAPI fake_SetWindowPlacement(HWND hWnd, const WINDOWPLACEMENT* lpwndpl); BOOL WINAPI fake_EnumDisplaySettingsA(LPCSTR lpszDeviceName, DWORD iModeNum, DEVMODEA* lpDevMode); SHORT WINAPI fake_GetKeyState(int nVirtKey); SHORT WINAPI fake_GetAsyncKeyState(int vKey); diff --git a/src/hook.c b/src/hook.c index debebbf..2d2b315 100644 --- a/src/hook.c +++ b/src/hook.c @@ -51,6 +51,7 @@ SETWINDOWSHOOKEXAPROC real_SetWindowsHookExA = SetWindowsHookExA; PEEKMESSAGEAPROC real_PeekMessageA = PeekMessageA; GETMESSAGEAPROC real_GetMessageA = GetMessageA; GETWINDOWPLACEMENTPROC real_GetWindowPlacement = GetWindowPlacement; +SETWINDOWPLACEMENTPROC real_SetWindowPlacement = SetWindowPlacement; ENUMDISPLAYSETTINGSAPROC real_EnumDisplaySettingsA = EnumDisplaySettingsA; GETKEYSTATEPROC real_GetKeyState = GetKeyState; GETASYNCKEYSTATEPROC real_GetAsyncKeyState = GetAsyncKeyState; @@ -105,6 +106,7 @@ HOOKLIST g_hook_hooklist[] = { "PeekMessageA", (PROC)fake_PeekMessageA, (PROC*)&real_PeekMessageA, 0 }, { "GetMessageA", (PROC)fake_GetMessageA, (PROC*)&real_GetMessageA, 0 }, { "GetWindowPlacement", (PROC)fake_GetWindowPlacement, (PROC*)&real_GetWindowPlacement, 0 }, + { "SetWindowPlacement", (PROC)fake_SetWindowPlacement, (PROC*)&real_SetWindowPlacement, 0 }, { "EnumDisplaySettingsA", (PROC)fake_EnumDisplaySettingsA, (PROC*)&real_EnumDisplaySettingsA, 0 }, { "GetKeyState", (PROC)fake_GetKeyState, (PROC*)&real_GetKeyState, 0 }, { "GetAsyncKeyState", (PROC)fake_GetAsyncKeyState, (PROC*)&real_GetAsyncKeyState, 0 }, diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index c6907e3..748b848 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -806,6 +806,17 @@ BOOL WINAPI fake_GetWindowPlacement(HWND hWnd, WINDOWPLACEMENT* lpwndpl) return result; } +BOOL WINAPI fake_SetWindowPlacement(HWND hWnd, const WINDOWPLACEMENT* lpwndpl) +{ + if (lpwndpl && g_ddraw.ref && g_ddraw.hwnd && hWnd == g_ddraw.hwnd) + { + if (lpwndpl->showCmd == SW_SHOWMAXIMIZED || lpwndpl->showCmd == SW_MAXIMIZE) + return TRUE; + } + + return real_SetWindowPlacement(hWnd, lpwndpl); +} + BOOL WINAPI fake_EnumDisplaySettingsA(LPCSTR lpszDeviceName, DWORD iModeNum, DEVMODEA* lpDevMode) { BOOL result = real_EnumDisplaySettingsA(lpszDeviceName, iModeNum, lpDevMode);