-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathInputHook.cpp
More file actions
85 lines (67 loc) · 1.82 KB
/
InputHook.cpp
File metadata and controls
85 lines (67 loc) · 1.82 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
//InputHook.cpp
#include "stdafx.h"
#define GXLPARAM(lp) ((short)LOWORD(lp))
#define GYLPARAM(lp) ((short)HIWORD(lp))
InputHook iHook;
WNDPROC oWndProc;
//using namespace Utility;
static std::set<InputHook::TKeyboardFn> g_keyboardFunctions;
void InputHook::keyboardHandlerRegister(TKeyboardFn function) {
g_keyboardFunctions.insert(function);
}
void InputHook::keyboardHandlerUnregister(TKeyboardFn function) {
g_keyboardFunctions.erase(function);
}
bool InputHook::Initialize() {
hWindow = NULL;
while (hWindow == NULL) {
hWindow = FindWindow(L"grcWindow", NULL);
Sleep(100);
}
oWndProc = (WNDPROC)SetWindowLongPtr(hWindow, GWLP_WNDPROC, (__int3264)(LONG_PTR)WndProc);
if (oWndProc == NULL) {
Log::Error("Failed to attach input hook");
return false;
}
else {
keyboardHandlerRegister(OnKeyboardMessage);
DEBUGMSG("Input hook attached: WndProc 0x%p", (DWORD_PTR)oWndProc);
return true;
}
}
void InputHook::Remove() {
SetWindowLongPtr(hWindow, GWLP_WNDPROC, (LONG_PTR)oWndProc);
DEBUGMSG("Removed input hook");
}
LRESULT APIENTRY WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_SIZE:
break;
case WM_LBUTTONDOWN:
break;
case WM_LBUTTONUP:
break;
case WM_RBUTTONDOWN:
break;
case WM_RBUTTONUP:
break;
case WM_MBUTTONDOWN:
break;
case WM_MBUTTONUP:
break;
case WM_MOUSEWHEEL:
break;
case WM_MOUSEMOVE:
break;
case WM_KEYDOWN: case WM_KEYUP: case WM_SYSKEYDOWN: case WM_SYSKEYUP:
{
auto functions = g_keyboardFunctions; for (auto & function : functions) function((DWORD)wParam, lParam & 0xFFFF, (lParam >> 16) & 0xFF, (lParam >> 24) & 1, (uMsg == WM_SYSKEYDOWN || uMsg == WM_SYSKEYUP), (lParam >> 30) & 1, (uMsg == WM_SYSKEYUP || uMsg == WM_KEYUP));
}
break;
case WM_CHAR:
break;
}
return CallWindowProc(oWndProc, hwnd, uMsg, wParam, lParam);
}