From 96714b01c0f8fdf8a03cdca731e2b55d86035c2e Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 2 Jun 2021 14:29:25 +0200 Subject: [PATCH] add new .ini settings fixwndprochook --- inc/dd.h | 1 + src/config.c | 1 + src/winapi_hooks.c | 28 ++++++++++++++++++++++++++-- 3 files changed, 28 insertions(+), 2 deletions(-) diff --git a/inc/dd.h b/inc/dd.h index 1bbf067..762bace 100644 --- a/inc/dd.h +++ b/inc/dd.h @@ -111,6 +111,7 @@ typedef struct cnc_ddraw BOOL nonexclusive; BOOL fixpitch; BOOL fixchildwindows; + BOOL fixwndprochook; BOOL d3d9linear; BOOL backbuffer; BOOL passthrough; diff --git a/src/config.c b/src/config.c index 6ebfa74..ba3c318 100644 --- a/src/config.c +++ b/src/config.c @@ -50,6 +50,7 @@ void cfg_load() g_ddraw->nonexclusive = cfg_get_bool("nonexclusive", FALSE); g_ddraw->fixpitch = cfg_get_bool("fixpitch", FALSE); g_ddraw->fixchildwindows = cfg_get_bool("fixchildwindows", TRUE); + g_ddraw->fixwndprochook = cfg_get_bool("fixwndprochook", FALSE); g_ddraw->d3d9linear = cfg_get_bool("d3d9linear", TRUE); g_ddraw->backbuffer = cfg_get_bool("backbuffer", TRUE); g_ddraw->passthrough = cfg_get_bool("passthrough", TRUE); diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index a9a9a06..79ed095 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -288,10 +288,34 @@ LRESULT WINAPI fake_SendMessageA(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lPar return result; } +static WNDPROC g_compat_wndproc; +LRESULT CALLBACK compat_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + return CallWindowProcA(g_compat_wndproc, hWnd, uMsg, wParam, lParam); +} + LONG WINAPI fake_SetWindowLongA(HWND hWnd, int nIndex, LONG dwNewLong) { - if (g_ddraw && g_ddraw->hwnd == hWnd && nIndex == GWL_STYLE) - return 0; + if (g_ddraw && g_ddraw->hwnd == hWnd) + { + if (nIndex == GWL_STYLE) + return 0; + + if (nIndex == GWL_WNDPROC && g_ddraw->fixwndprochook) + { + if (dwNewLong == (LONG)compat_WndProc) + { + LONG result = real_SetWindowLongA(hWnd, nIndex, (LONG)g_compat_wndproc); + g_compat_wndproc = NULL; + return result; + } + else if (!g_compat_wndproc) + { + g_compat_wndproc = (WNDPROC)real_SetWindowLongA(hWnd, nIndex, dwNewLong); + return g_compat_wndproc ? (LONG)compat_WndProc : 0; + } + } + } return real_SetWindowLongA(hWnd, nIndex, dwNewLong); }