mirror of
https://github.com/narzoul/DDrawCompat
synced 2024-12-30 08:55:36 +01:00
Fixed hotkeys not working in some cases
See e.g. Swen Zwo.
This commit is contained in:
parent
2f52e1028b
commit
f96a0376bf
@ -29,6 +29,9 @@ public:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int getMax() const { return max; }
|
||||||
|
int getMin() const { return min; }
|
||||||
|
|
||||||
void reset()
|
void reset()
|
||||||
{
|
{
|
||||||
m_bits.fill(0);
|
m_bits.fill(0);
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
#include <Config/Parser.h>
|
#include <Config/Parser.h>
|
||||||
#include <Input/HotKey.h>
|
#include <Input/HotKey.h>
|
||||||
|
#include <Input/Input.h>
|
||||||
|
|
||||||
namespace
|
namespace
|
||||||
{
|
{
|
||||||
@ -162,7 +163,7 @@ namespace
|
|||||||
return modifiers.find(either) == modifiers.end() &&
|
return modifiers.find(either) == modifiers.end() &&
|
||||||
modifiers.find(left) == modifiers.end() &&
|
modifiers.find(left) == modifiers.end() &&
|
||||||
modifiers.find(right) == modifiers.end() &&
|
modifiers.find(right) == modifiers.end() &&
|
||||||
(GetAsyncKeyState(either) & 0x8000);
|
Input::isKeyDown(either);
|
||||||
}
|
}
|
||||||
|
|
||||||
UINT getKeyCode(const std::string& name, const std::map<std::string, UINT>& keyNames)
|
UINT getKeyCode(const std::string& name, const std::map<std::string, UINT>& keyNames)
|
||||||
@ -223,7 +224,7 @@ namespace Input
|
|||||||
{
|
{
|
||||||
for (auto modifier : modifiers)
|
for (auto modifier : modifiers)
|
||||||
{
|
{
|
||||||
if (0 == (GetAsyncKeyState(modifier) & 0x8000))
|
if (!isKeyDown(modifier))
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -5,6 +5,7 @@
|
|||||||
#include <Windows.h>
|
#include <Windows.h>
|
||||||
#include <winternl.h>
|
#include <winternl.h>
|
||||||
|
|
||||||
|
#include <Common/BitSet.h>
|
||||||
#include <Common/Hook.h>
|
#include <Common/Hook.h>
|
||||||
#include <Common/Log.h>
|
#include <Common/Log.h>
|
||||||
#include <Common/Path.h>
|
#include <Common/Path.h>
|
||||||
@ -46,6 +47,7 @@ namespace
|
|||||||
RECT g_monitorRect = {};
|
RECT g_monitorRect = {};
|
||||||
HHOOK g_keyboardHook = nullptr;
|
HHOOK g_keyboardHook = nullptr;
|
||||||
HHOOK g_mouseHook = nullptr;
|
HHOOK g_mouseHook = nullptr;
|
||||||
|
BitSet<VK_LBUTTON, VK_OEM_CLEAR> g_keyState;
|
||||||
|
|
||||||
DInputMouseHookData g_dinputMouseHookData = {};
|
DInputMouseHookData g_dinputMouseHookData = {};
|
||||||
decltype(&PhysicalToLogicalPointForPerMonitorDPI) g_physicalToLogicalPointForPerMonitorDPI = nullptr;
|
decltype(&PhysicalToLogicalPointForPerMonitorDPI) g_physicalToLogicalPointForPerMonitorDPI = nullptr;
|
||||||
@ -126,11 +128,24 @@ namespace
|
|||||||
if (HC_ACTION == nCode &&
|
if (HC_ACTION == nCode &&
|
||||||
(WM_KEYDOWN == wParam || WM_KEYUP == wParam || WM_SYSKEYDOWN == wParam || WM_SYSKEYUP == wParam))
|
(WM_KEYDOWN == wParam || WM_KEYUP == wParam || WM_SYSKEYDOWN == wParam || WM_SYSKEYUP == wParam))
|
||||||
{
|
{
|
||||||
|
auto llHook = reinterpret_cast<const KBDLLHOOKSTRUCT*>(lParam);
|
||||||
|
if (static_cast<int>(llHook->vkCode) >= g_keyState.getMin() &&
|
||||||
|
static_cast<int>(llHook->vkCode) <= g_keyState.getMax())
|
||||||
|
{
|
||||||
|
if (WM_KEYDOWN == wParam || WM_SYSKEYDOWN == wParam)
|
||||||
|
{
|
||||||
|
g_keyState.set(llHook->vkCode);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
g_keyState.reset(llHook->vkCode);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
DWORD pid = 0;
|
DWORD pid = 0;
|
||||||
GetWindowThreadProcessId(GetForegroundWindow(), &pid);
|
GetWindowThreadProcessId(GetForegroundWindow(), &pid);
|
||||||
if (GetCurrentProcessId() == pid)
|
if (GetCurrentProcessId() == pid)
|
||||||
{
|
{
|
||||||
auto llHook = reinterpret_cast<const KBDLLHOOKSTRUCT*>(lParam);
|
|
||||||
for (auto& hotkey : g_hotKeys)
|
for (auto& hotkey : g_hotKeys)
|
||||||
{
|
{
|
||||||
if (hotkey.first.vk == llHook->vkCode && Input::areModifierKeysDown(hotkey.first.modifiers))
|
if (hotkey.first.vk == llHook->vkCode && Input::areModifierKeysDown(hotkey.first.modifiers))
|
||||||
@ -235,7 +250,13 @@ namespace
|
|||||||
{
|
{
|
||||||
UnhookWindowsHookEx(g_keyboardHook);
|
UnhookWindowsHookEx(g_keyboardHook);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
g_keyState.reset();
|
||||||
g_keyboardHook = CALL_ORIG_FUNC(SetWindowsHookExA)(WH_KEYBOARD_LL, &lowLevelKeyboardProc, nullptr, 0);
|
g_keyboardHook = CALL_ORIG_FUNC(SetWindowsHookExA)(WH_KEYBOARD_LL, &lowLevelKeyboardProc, nullptr, 0);
|
||||||
|
if (!g_keyboardHook)
|
||||||
|
{
|
||||||
|
LOG_ONCE("ERROR: Failed to install low level keyboard hook, error code: " << GetLastError());
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -251,12 +272,19 @@ namespace
|
|||||||
g_origCursorPos = { MAXLONG, MAXLONG };
|
g_origCursorPos = { MAXLONG, MAXLONG };
|
||||||
g_mouseHook = CALL_ORIG_FUNC(SetWindowsHookExA)(WH_MOUSE_LL, &lowLevelMouseProc, nullptr, 0);
|
g_mouseHook = CALL_ORIG_FUNC(SetWindowsHookExA)(WH_MOUSE_LL, &lowLevelMouseProc, nullptr, 0);
|
||||||
|
|
||||||
INPUT inputs[2] = {};
|
if (g_mouseHook)
|
||||||
inputs[0].mi.dy = 1;
|
{
|
||||||
inputs[0].mi.dwFlags = MOUSEEVENTF_MOVE;
|
INPUT inputs[2] = {};
|
||||||
inputs[1].mi.dx = 1;
|
inputs[0].mi.dy = 1;
|
||||||
inputs[1].mi.dwFlags = MOUSEEVENTF_MOVE;
|
inputs[0].mi.dwFlags = MOUSEEVENTF_MOVE;
|
||||||
SendInput(2, inputs, sizeof(INPUT));
|
inputs[1].mi.dx = 1;
|
||||||
|
inputs[1].mi.dwFlags = MOUSEEVENTF_MOVE;
|
||||||
|
SendInput(2, inputs, sizeof(INPUT));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
LOG_ONCE("ERROR: Failed to install low level mouse hook, error code: " << GetLastError());
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -391,6 +419,25 @@ namespace Input
|
|||||||
registerHotKey(Config::terminateHotKey.get(), onTerminate, nullptr, false);
|
registerHotKey(Config::terminateHotKey.get(), onTerminate, nullptr, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool isKeyDown(int vk)
|
||||||
|
{
|
||||||
|
switch (vk)
|
||||||
|
{
|
||||||
|
case VK_SHIFT:
|
||||||
|
return g_keyState.test(VK_LSHIFT) || g_keyState.test(VK_RSHIFT);
|
||||||
|
case VK_CONTROL:
|
||||||
|
return g_keyState.test(VK_LCONTROL) || g_keyState.test(VK_RCONTROL);
|
||||||
|
case VK_MENU:
|
||||||
|
return g_keyState.test(VK_LMENU) || g_keyState.test(VK_RMENU);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (vk >= g_keyState.getMin() && vk <= g_keyState.getMax())
|
||||||
|
{
|
||||||
|
return g_keyState.test(vk);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
void registerHotKey(const HotKey& hotKey, std::function<void(void*)> action, void* context, bool onKeyDown)
|
void registerHotKey(const HotKey& hotKey, std::function<void(void*)> action, void* context, bool onKeyDown)
|
||||||
{
|
{
|
||||||
if (0 != hotKey.vk)
|
if (0 != hotKey.vk)
|
||||||
|
@ -21,6 +21,7 @@ namespace Input
|
|||||||
HWND getCursorWindow();
|
HWND getCursorWindow();
|
||||||
POINT getRelativeCursorPos();
|
POINT getRelativeCursorPos();
|
||||||
void installHooks();
|
void installHooks();
|
||||||
|
bool isKeyDown(int vk);
|
||||||
void registerHotKey(const HotKey& hotKey, std::function<void(void*)> action, void* context, bool onKeydown = true);
|
void registerHotKey(const HotKey& hotKey, std::function<void(void*)> action, void* context, bool onKeydown = true);
|
||||||
void setCapture(Overlay::Control* control);
|
void setCapture(Overlay::Control* control);
|
||||||
void updateCursor();
|
void updateCursor();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user