80 lines
2.0 KiB
C++
80 lines
2.0 KiB
C++
#if defined(_WIN32)
|
|
#include "../../global/globals.hpp"
|
|
#include "../hotkeys.hpp"
|
|
#include <Windows.h>
|
|
#include <chrono>
|
|
|
|
using namespace std::chrono_literals;
|
|
|
|
namespace Soundux::Objects
|
|
{
|
|
HHOOK oKeyBoardProc;
|
|
LRESULT CALLBACK keyBoardProc(int nCode, WPARAM wParam, LPARAM lParam)
|
|
{
|
|
if (nCode == HC_ACTION)
|
|
{
|
|
if (wParam == WM_KEYDOWN || wParam == WM_SYSKEYDOWN)
|
|
{
|
|
auto *info = reinterpret_cast<PKBDLLHOOKSTRUCT>(lParam);
|
|
Globals::gHotKeys.onKeyDown(info->vkCode);
|
|
}
|
|
else if (wParam == WM_KEYUP || wParam == WM_SYSKEYUP)
|
|
{
|
|
auto *info = reinterpret_cast<PKBDLLHOOKSTRUCT>(lParam);
|
|
Globals::gHotKeys.onKeyUp(info->vkCode);
|
|
}
|
|
}
|
|
return CallNextHookEx(oKeyBoardProc, nCode, wParam, lParam);
|
|
}
|
|
|
|
void Hotkeys::listen()
|
|
{
|
|
oKeyBoardProc = SetWindowsHookEx(WH_KEYBOARD_LL, keyBoardProc, nullptr, NULL);
|
|
|
|
MSG message;
|
|
while (!kill)
|
|
{
|
|
if (PeekMessage(&message, nullptr, 0, 0, PM_REMOVE) != 0)
|
|
{
|
|
TranslateMessage(&message);
|
|
DispatchMessage(&message);
|
|
}
|
|
}
|
|
|
|
UnhookWindowsHookEx(oKeyBoardProc);
|
|
}
|
|
|
|
std::string Hotkeys::getKeyName(const int &key)
|
|
{
|
|
auto scanCode = MapVirtualKey(key, MAPVK_VK_TO_VSC);
|
|
|
|
CHAR name[128];
|
|
int result = 0;
|
|
switch (key)
|
|
{
|
|
case VK_LEFT:
|
|
case VK_UP:
|
|
case VK_RIGHT:
|
|
case VK_DOWN:
|
|
case VK_RCONTROL:
|
|
case VK_RMENU:
|
|
case VK_LWIN:
|
|
case VK_RWIN:
|
|
case VK_APPS:
|
|
case VK_PRIOR:
|
|
case VK_NEXT:
|
|
case VK_END:
|
|
case VK_HOME:
|
|
case VK_INSERT:
|
|
case VK_DELETE:
|
|
case VK_DIVIDE:
|
|
case VK_NUMLOCK:
|
|
scanCode |= KF_EXTENDED;
|
|
default:
|
|
result = GetKeyNameTextA(scanCode << 16, name, 128);
|
|
}
|
|
|
|
return name;
|
|
}
|
|
} // namespace Soundux::Objects
|
|
#endif |