mirror of
https://github.com/FunkyFr3sh/cnc-ddraw.git
synced 2025-03-15 06:04:49 +01:00
fix hotkey for Fallout2, jagged alliance 2, trivia and a probably a few other games
This commit is contained in:
parent
a063e25825
commit
9c18999a11
@ -51,6 +51,7 @@
|
|||||||
<ClCompile Include="src\IDirectDraw\IDirectDrawGammaControl.c" />
|
<ClCompile Include="src\IDirectDraw\IDirectDrawGammaControl.c" />
|
||||||
<ClCompile Include="src\indeo.c" />
|
<ClCompile Include="src\indeo.c" />
|
||||||
<ClCompile Include="src\ini.c" />
|
<ClCompile Include="src\ini.c" />
|
||||||
|
<ClCompile Include="src\keyboard.c" />
|
||||||
<ClCompile Include="src\utils.c" />
|
<ClCompile Include="src\utils.c" />
|
||||||
<ClCompile Include="src\hook.c" />
|
<ClCompile Include="src\hook.c" />
|
||||||
<ClCompile Include="src\IDirectDraw\IDirectDraw.c" />
|
<ClCompile Include="src\IDirectDraw\IDirectDraw.c" />
|
||||||
@ -87,6 +88,7 @@
|
|||||||
<ClInclude Include="inc\IDirectDrawGammaControl.h" />
|
<ClInclude Include="inc\IDirectDrawGammaControl.h" />
|
||||||
<ClInclude Include="inc\indeo.h" />
|
<ClInclude Include="inc\indeo.h" />
|
||||||
<ClInclude Include="inc\ini.h" />
|
<ClInclude Include="inc\ini.h" />
|
||||||
|
<ClInclude Include="inc\keyboard.h" />
|
||||||
<ClInclude Include="inc\patch.h" />
|
<ClInclude Include="inc\patch.h" />
|
||||||
<ClInclude Include="inc\utils.h" />
|
<ClInclude Include="inc\utils.h" />
|
||||||
<ClInclude Include="inc\hook.h" />
|
<ClInclude Include="inc\hook.h" />
|
||||||
|
@ -165,6 +165,9 @@
|
|||||||
<ClCompile Include="src\indeo.c">
|
<ClCompile Include="src\indeo.c">
|
||||||
<Filter>Source Files</Filter>
|
<Filter>Source Files</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
<ClCompile Include="src\keyboard.c">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClInclude Include="inc\debug.h">
|
<ClInclude Include="inc\debug.h">
|
||||||
@ -287,6 +290,9 @@
|
|||||||
<ClInclude Include="inc\indeo.h">
|
<ClInclude Include="inc\indeo.h">
|
||||||
<Filter>Header Files</Filter>
|
<Filter>Header Files</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
|
<ClInclude Include="inc\keyboard.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ResourceCompile Include="res.rc">
|
<ResourceCompile Include="res.rc">
|
||||||
|
11
inc/keyboard.h
Normal file
11
inc/keyboard.h
Normal 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
|
3
src/dd.c
3
src/dd.c
@ -6,6 +6,7 @@
|
|||||||
#include "hook.h"
|
#include "hook.h"
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
#include "mouse.h"
|
#include "mouse.h"
|
||||||
|
#include "keyboard.h"
|
||||||
#include "wndproc.h"
|
#include "wndproc.h"
|
||||||
#include "render_d3d9.h"
|
#include "render_d3d9.h"
|
||||||
#include "render_gdi.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.wndproc = (WNDPROC)real_SetWindowLongA(g_ddraw.hwnd, GWL_WNDPROC, (LONG)fake_WndProc);
|
||||||
g_ddraw.gui_thread_id = GetWindowThreadProcessId(g_ddraw.hwnd, NULL);
|
g_ddraw.gui_thread_id = GetWindowThreadProcessId(g_ddraw.hwnd, NULL);
|
||||||
|
|
||||||
|
keyboard_hook_init();
|
||||||
|
|
||||||
if (!g_ddraw.render.hdc)
|
if (!g_ddraw.render.hdc)
|
||||||
{
|
{
|
||||||
g_ddraw.render.hdc = GetDC(g_ddraw.hwnd);
|
g_ddraw.render.hdc = GetDC(g_ddraw.hwnd);
|
||||||
|
@ -138,6 +138,7 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved)
|
|||||||
|
|
||||||
indeo_disable();
|
indeo_disable();
|
||||||
timeEndPeriod(1);
|
timeEndPeriod(1);
|
||||||
|
keyboard_hook_exit();
|
||||||
dinput_hook_exit();
|
dinput_hook_exit();
|
||||||
hook_exit();
|
hook_exit();
|
||||||
break;
|
break;
|
||||||
|
102
src/keyboard.c
Normal file
102
src/keyboard.c
Normal 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);
|
||||||
|
}
|
@ -9,6 +9,7 @@
|
|||||||
#include "config.h"
|
#include "config.h"
|
||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
#include "mouse.h"
|
#include "mouse.h"
|
||||||
|
#include "keyboard.h"
|
||||||
#include "wndproc.h"
|
#include "wndproc.h"
|
||||||
#include "render_gdi.h"
|
#include "render_gdi.h"
|
||||||
#include "render_d3d9.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 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)
|
BOOL HandleMessage(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax)
|
||||||
|
@ -758,29 +758,6 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam
|
|||||||
}
|
}
|
||||||
case WM_SYSKEYDOWN:
|
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)
|
if (wParam == VK_MENU)
|
||||||
{
|
{
|
||||||
g_ddraw.alt_key_down = TRUE;
|
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;
|
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);
|
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:
|
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;
|
break;
|
||||||
}
|
}
|
||||||
case WM_KEYUP:
|
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;
|
break;
|
||||||
}
|
}
|
||||||
/* button up messages reactivate cursor lock */
|
/* button up messages reactivate cursor lock */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user