1
0
mirror of https://github.com/FunkyFr3sh/cnc-ddraw.git synced 2025-03-14 22:03:27 +01:00

fix hotkey for Fallout2, jagged alliance 2, trivia and a probably a few other games

This commit is contained in:
FunkyFr3sh 2024-09-06 18:10:22 +02:00
parent a063e25825
commit 9c18999a11
8 changed files with 135 additions and 57 deletions

View File

@ -51,6 +51,7 @@
<ClCompile Include="src\IDirectDraw\IDirectDrawGammaControl.c" />
<ClCompile Include="src\indeo.c" />
<ClCompile Include="src\ini.c" />
<ClCompile Include="src\keyboard.c" />
<ClCompile Include="src\utils.c" />
<ClCompile Include="src\hook.c" />
<ClCompile Include="src\IDirectDraw\IDirectDraw.c" />
@ -87,6 +88,7 @@
<ClInclude Include="inc\IDirectDrawGammaControl.h" />
<ClInclude Include="inc\indeo.h" />
<ClInclude Include="inc\ini.h" />
<ClInclude Include="inc\keyboard.h" />
<ClInclude Include="inc\patch.h" />
<ClInclude Include="inc\utils.h" />
<ClInclude Include="inc\hook.h" />

View File

@ -165,6 +165,9 @@
<ClCompile Include="src\indeo.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="src\keyboard.c">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="inc\debug.h">
@ -287,6 +290,9 @@
<ClInclude Include="inc\indeo.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="inc\keyboard.h">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<ResourceCompile Include="res.rc">

11
inc/keyboard.h Normal file
View File

@ -0,0 +1,11 @@
#ifndef KEYBOARD_H
#define KEYBOARD_H
void keyboard_hook_init();
void keyboard_hook_exit();
LRESULT CALLBACK keyboard_hook_proc(int Code, WPARAM wParam, LPARAM lParam);
extern HHOOK g_keyboard_hook;
#endif

View File

@ -6,6 +6,7 @@
#include "hook.h"
#include "config.h"
#include "mouse.h"
#include "keyboard.h"
#include "wndproc.h"
#include "render_d3d9.h"
#include "render_gdi.h"
@ -1362,6 +1363,8 @@ HRESULT dd_SetCooperativeLevel(HWND hwnd, DWORD dwFlags)
g_ddraw.wndproc = (WNDPROC)real_SetWindowLongA(g_ddraw.hwnd, GWL_WNDPROC, (LONG)fake_WndProc);
g_ddraw.gui_thread_id = GetWindowThreadProcessId(g_ddraw.hwnd, NULL);
keyboard_hook_init();
if (!g_ddraw.render.hdc)
{
g_ddraw.render.hdc = GetDC(g_ddraw.hwnd);

View File

@ -138,6 +138,7 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved)
indeo_disable();
timeEndPeriod(1);
keyboard_hook_exit();
dinput_hook_exit();
hook_exit();
break;

102
src/keyboard.c Normal file
View File

@ -0,0 +1,102 @@
#include <windows.h>
#include "debug.h"
#include "hook.h"
#include "dd.h"
#include "utils.h"
#include "config.h"
#include "keyboard.h"
#include "mouse.h"
HHOOK g_keyboard_hook;
void keyboard_hook_init()
{
if (g_keyboard_hook && UnhookWindowsHookEx(g_keyboard_hook))
{
g_keyboard_hook = NULL;
}
if (!g_ddraw.gui_thread_id)
return;
g_keyboard_hook =
real_SetWindowsHookExA(
WH_KEYBOARD,
keyboard_hook_proc,
NULL,
g_ddraw.gui_thread_id);
}
void keyboard_hook_exit()
{
if (g_keyboard_hook)
{
UnhookWindowsHookEx(g_keyboard_hook);
}
}
LRESULT CALLBACK keyboard_hook_proc(int code, WPARAM wParam, LPARAM lParam)
{
if (code < 0 || !wParam) // code != HC_ACTION ||
return CallNextHookEx(g_keyboard_hook, code, wParam, lParam);
BOOL alt_down = (lParam & (1 << 29));
BOOL key_down = !(lParam & (1 << 30));
BOOL key_up = !!(lParam & (1 << 31));
if (wParam == g_config.hotkeys.toggle_fullscreen && alt_down)
{
if (key_up)
util_toggle_fullscreen();
return 1;
}
if (wParam == g_config.hotkeys.toggle_maximize &&
g_config.resizable &&
g_config.windowed &&
!g_config.fullscreen &&
alt_down)
{
if (key_up)
util_toggle_maximize();
return 1;
}
if (g_config.homm_hack && wParam == VK_F4) /* Heroes of Might and Magic 3 and 4 */
{
if (key_up)
util_toggle_fullscreen();
return 1;
}
if (wParam == VK_CONTROL || wParam == g_config.hotkeys.unlock_cursor1)
{
if ((real_GetAsyncKeyState(VK_CONTROL) & 0x8000) &&
(real_GetAsyncKeyState(g_config.hotkeys.unlock_cursor1) & 0x8000))
{
mouse_unlock();
return 1;
}
}
if (wParam == g_config.hotkeys.unlock_cursor2 || wParam == VK_MENU || wParam == VK_CONTROL)
{
if ((real_GetAsyncKeyState(VK_RMENU) & 0x8000) &&
(real_GetAsyncKeyState(g_config.hotkeys.unlock_cursor2) & 0x8000))
{
mouse_unlock();
return 1;
}
}
if (key_up && wParam == g_config.hotkeys.screenshot)
{
ss_take_screenshot(g_ddraw.primary);
}
return CallNextHookEx(g_keyboard_hook, code, wParam, lParam);
}

View File

@ -9,6 +9,7 @@
#include "config.h"
#include "utils.h"
#include "mouse.h"
#include "keyboard.h"
#include "wndproc.h"
#include "render_gdi.h"
#include "render_d3d9.h"
@ -601,7 +602,14 @@ HHOOK WINAPI fake_SetWindowsHookExA(int idHook, HOOKPROC lpfn, HINSTANCE hmod, D
return g_mouse_hook = real_SetWindowsHookExA(idHook, mouse_hook_proc, hmod, dwThreadId);
}
return real_SetWindowsHookExA(idHook, lpfn, hmod, dwThreadId);
HHOOK result = real_SetWindowsHookExA(idHook, lpfn, hmod, dwThreadId);
if (idHook == WH_KEYBOARD)
{
keyboard_hook_init();
}
return result;
}
BOOL HandleMessage(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax)

View File

@ -758,29 +758,6 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam
}
case WM_SYSKEYDOWN:
{
BOOL context_code = (lParam & (1 << 29)) != 0;
BOOL key_state = (lParam & (1 << 30)) != 0;
if (g_config.hotkeys.toggle_fullscreen &&
wParam == g_config.hotkeys.toggle_fullscreen &&
(!g_config.fullscreen || g_config.toggle_upscaled || (g_config.windowed && g_config.toggle_borderless)) &&
context_code &&
!key_state)
{
util_toggle_fullscreen();
return 0;
}
if (g_config.hotkeys.toggle_maximize &&
wParam == g_config.hotkeys.toggle_maximize &&
g_config.resizable &&
g_config.windowed &&
!g_config.fullscreen)
{
util_toggle_maximize();
return 0;
}
if (wParam == VK_MENU)
{
g_ddraw.alt_key_down = TRUE;
@ -795,7 +772,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam
g_ddraw.alt_key_down = FALSE;
}
if (wParam == VK_TAB || (g_config.hotkeys.toggle_fullscreen && wParam == g_config.hotkeys.toggle_fullscreen))
if (wParam == VK_TAB || (wParam && wParam == g_config.hotkeys.toggle_fullscreen))
{
return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
@ -804,42 +781,10 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam
}
case WM_KEYDOWN:
{
if (g_config.homm_hack && wParam == VK_F4) /* Heroes of Might and Magic 3 and 4 */
{
util_toggle_fullscreen();
return 0;
}
if (g_config.hotkeys.unlock_cursor1 &&
(wParam == VK_CONTROL || wParam == g_config.hotkeys.unlock_cursor1))
{
if (real_GetAsyncKeyState(VK_CONTROL) & 0x8000 && real_GetAsyncKeyState(g_config.hotkeys.unlock_cursor1) & 0x8000)
{
mouse_unlock();
return 0;
}
}
if (g_config.hotkeys.unlock_cursor2 &&
(wParam == g_config.hotkeys.unlock_cursor2 || wParam == VK_MENU || wParam == VK_CONTROL))
{
if ((real_GetAsyncKeyState(VK_RMENU) & 0x8000) && real_GetAsyncKeyState(g_config.hotkeys.unlock_cursor2) & 0x8000)
{
mouse_unlock();
return 0;
}
}
break;
}
case WM_KEYUP:
{
if (g_config.homm_hack && wParam == VK_F4) /* Heroes of Might and Magic 3 and 4 */
return 0;
if (g_config.hotkeys.screenshot && wParam == g_config.hotkeys.screenshot)
ss_take_screenshot(g_ddraw.primary);
break;
}
/* button up messages reactivate cursor lock */