11#pragma once
2+ #include < ntddkbd.h>
3+ #include < ntddmou.h>
24#include " base.hpp"
35#include " usb.hpp"
46
@@ -43,43 +45,49 @@ namespace Send::Type::Internal {
4345 Mouse = 2
4446 } type;
4547 union {
46- struct {
47- uint32_t absolute_coord;
48- struct {
49- bool LButtonDown : 1 ;
50- bool LButtonUp : 1 ;
51- bool RButtonDown : 1 ;
52- bool RButtonUp : 1 ;
53- bool MButtonDown : 1 ;
54- bool MButtonUp : 1 ;
55- bool XButton1Down : 1 ;
56- bool XButton1Up : 1 ;
57- bool XButton2Down : 1 ;
58- bool XButton2Up : 1 ;
59- bool Wheel : 1 ;
60- bool HWheel : 1 ;
61- uint8_t unk : 4 ;
62- private:
63- void assert_size () {
64- static_assert (sizeof (*this ) == 2 );
65- }
66- } btn;
67- int16_t movement;
68- uint32_t unk1;
69- int32_t x;
70- int32_t y;
71- uint32_t unk2;
72- } mi;
73- struct {
74- uint16_t unk1;
75- int16_t key;
76- uint16_t action;
77- uint16_t unk2;
78- uint32_t unk3;
79- uint32_t unk4;
80- uint32_t unk5;
81- uint32_t unk6;
82- } ki;
48+ // struct {
49+ // uint32_t absolute_coord;
50+ // struct {
51+ // bool LButtonDown : 1;
52+ // bool LButtonUp : 1;
53+ // bool RButtonDown : 1;
54+ // bool RButtonUp : 1;
55+ // bool MButtonDown : 1;
56+ // bool MButtonUp : 1;
57+ // bool XButton1Down : 1;
58+ // bool XButton1Up : 1;
59+ // bool XButton2Down : 1;
60+ // bool XButton2Up : 1;
61+ // bool Wheel : 1;
62+ // bool HWheel : 1;
63+ // uint8_t unk : 4;
64+ // private:
65+ // void assert_size() {
66+ // static_assert(sizeof(*this) == 2);
67+ // }
68+ // } btn;
69+ // int16_t movement;
70+ // uint32_t unk1;
71+ // int32_t x;
72+ // int32_t y;
73+ // uint32_t unk2;
74+ // } mi;
75+
76+ MOUSE_INPUT_DATA mi;
77+
78+ // struct {
79+ // uint16_t unk1;
80+ // int16_t key;
81+ // uint16_t action;
82+ // uint16_t unk2;
83+ // uint32_t unk3;
84+ // uint32_t unk4;
85+ // uint32_t unk5;
86+ // uint32_t unk6;
87+ // } ki;
88+
89+ // / The high byte of MakeCode has no effect, extended keys are supported by Flags
90+ KEYBOARD_INPUT_DATA ki;
8391 };
8492 private:
8593 void assert_size () {
@@ -93,40 +101,48 @@ namespace Send::Type::Internal {
93101 if (mi.dwFlags & MOUSEEVENTF_MOVE) {
94102 POINT move{ mi.dx , mi.dy };
95103 if (mi.dwFlags & MOUSEEVENTF_ABSOLUTE) {
96- control.mi .absolute_coord = 0x10000 ;
104+ control.mi .Flags = MOUSE_MOVE_ABSOLUTE ;
97105 }
98- control.mi .x = mi.dx ;
99- control.mi .y = mi.dy ;
106+ control.mi .LastX = mi.dx ;
107+ control.mi .LastY = mi.dy ;
100108 }
101109
102- #define CODE_GENERATE (down, up, member ) \
103- control.mi .btn .##member##Down = mi.dwFlags & down; \
104- control.mi .btn .##member##Up = mi.dwFlags & up;
110+ if (mi.dwFlags & MOUSEEVENTF_LEFTDOWN)
111+ control.mi .ButtonFlags |= MOUSE_LEFT_BUTTON_DOWN;
112+ if (mi.dwFlags & MOUSEEVENTF_LEFTUP)
113+ control.mi .ButtonFlags |= MOUSE_LEFT_BUTTON_UP;
114+ if (mi.dwFlags & MOUSEEVENTF_RIGHTDOWN)
115+ control.mi .ButtonFlags |= MOUSE_RIGHT_BUTTON_DOWN;
116+ if (mi.dwFlags & MOUSEEVENTF_RIGHTUP)
117+ control.mi .ButtonFlags |= MOUSE_RIGHT_BUTTON_UP;
118+ if (mi.dwFlags & MOUSEEVENTF_MIDDLEDOWN)
119+ control.mi .ButtonFlags |= MOUSE_MIDDLE_BUTTON_DOWN;
120+ if (mi.dwFlags & MOUSEEVENTF_MIDDLEUP)
121+ control.mi .ButtonFlags |= MOUSE_MIDDLE_BUTTON_UP;
105122
106- CODE_GENERATE (MOUSEEVENTF_LEFTDOWN, MOUSEEVENTF_LEFTUP, LButton) // #TODO: may be switched?
107- CODE_GENERATE (MOUSEEVENTF_RIGHTDOWN, MOUSEEVENTF_RIGHTUP, RButton)
108- CODE_GENERATE (MOUSEEVENTF_MIDDLEDOWN, MOUSEEVENTF_MIDDLEUP, MButton)
109- #undef CODE_GENERATE
110123 if (mi.dwFlags & MOUSEEVENTF_XDOWN) {
111124 switch (mi.mouseData ) {
112- case XBUTTON1: control.mi .btn . XButton1Down = 1 ; break ;
113- case XBUTTON2: control.mi .btn . XButton2Down = 1 ; break ;
125+ case XBUTTON1: control.mi .ButtonFlags |= MOUSE_BUTTON_4_DOWN ; break ;
126+ case XBUTTON2: control.mi .ButtonFlags |= MOUSE_BUTTON_5_DOWN ; break ;
114127 }
115- } else if (mi.dwFlags & MOUSEEVENTF_XUP) {
128+ }
129+ if (mi.dwFlags & MOUSEEVENTF_XUP) {
116130 switch (mi.mouseData ) {
117- case XBUTTON1: control.mi .btn . XButton1Up = 1 ; break ;
118- case XBUTTON2: control.mi .btn . XButton2Up = 1 ; break ;
131+ case XBUTTON1: control.mi .ButtonFlags |= MOUSE_BUTTON_4_UP ; break ;
132+ case XBUTTON2: control.mi .ButtonFlags |= MOUSE_BUTTON_5_UP ; break ;
119133 }
120- } else if (mi.dwFlags & MOUSEEVENTF_WHEEL || mi.dwFlags & MOUSEEVENTF_HWHEEL) {
134+ }
135+
136+ if (mi.dwFlags & MOUSEEVENTF_WHEEL || mi.dwFlags & MOUSEEVENTF_HWHEEL) {
121137 if (mi.dwFlags & MOUSEEVENTF_WHEEL)
122- control.mi .btn . Wheel = 1 ;
138+ control.mi .ButtonFlags |= MOUSE_WHEEL ;
123139 else
124- control.mi .btn . HWheel = 1 ;
125- control.mi .movement = 120 * std::bit_cast<int32_t >(mi.mouseData ); // #TODO
140+ control.mi .ButtonFlags |= MOUSE_HWHEEL ;
141+ control.mi .ButtonData = 120 * std::bit_cast<int32_t >(mi.mouseData ); // #TODO
126142 }
127143
128144 if constexpr (debug)
129- DebugOStream () << L" send_mouse_input: " << *(uint16_t *)&control.mi .btn << L" , (" << control.mi .x << L" , " << control.mi .y << L" ) " << control.mi .absolute_coord << std::endl;
145+ DebugOStream () << L" send_mouse_input: " << *(uint16_t *)&control.mi .ButtonFlags << L" , (" << control.mi .LastX << L" , " << control.mi .LastY << L" ) " << control.mi .Flags << std::endl;
130146
131147 DWORD bytes_returned;
132148 return DeviceIoControl (device, 0x88883020 , &control, sizeof control, nullptr , 0 , &bytes_returned, nullptr );
@@ -135,7 +151,7 @@ namespace Send::Type::Internal {
135151 bool send_keyboard_input (const KEYBDINPUT& ki) override {
136152 RzControl control{ .type = RzControl::Type::Keyboard };
137153
138- if ((control.ki .key = keyboard_vk_to_key (ki.wVk )) < 0 )
154+ if ((control.ki .MakeCode = keyboard_vk_to_key (ki.wVk )) < 0 )
139155 return false ;
140156
141157 std::lock_guard lock (keyboard_mutex);
@@ -144,6 +160,10 @@ namespace Send::Type::Internal {
144160 if (is_modifier (ki.wVk ))
145161 set_modifier_state (ki.wVk , keydown);
146162
163+ control.ki .Flags = keydown ? KEY_MAKE : KEY_BREAK;
164+
165+ // Extended keys
166+ // TODO: E1
147167 switch (ki.wVk )
148168 {
149169 case VK_SNAPSHOT:
@@ -159,15 +179,14 @@ namespace Send::Type::Internal {
159179 case VK_UP:
160180 case VK_LWIN:
161181 case VK_RWIN:
162- control.ki .action = keydown ? 2 : 3 ;
182+ control.ki .Flags |= KEY_E0 ;
163183 break ;
164184 default :
165- control.ki .action = keydown ? 0 : 1 ;
166185 break ;
167186 }
168187
169188 if constexpr (debug)
170- DebugOStream () << L" send_keyboard_input: " << control.ki .key << " , " << control.ki .action << std::endl;
189+ DebugOStream () << L" send_keyboard_input: " << control.ki .MakeCode << " , " << control.ki .Flags << std::endl;
171190
172191 DWORD bytes_returned;
173192 return DeviceIoControl (device, 0x88883020 , &control, sizeof control, nullptr , 0 , &bytes_returned, nullptr );
@@ -179,8 +198,17 @@ namespace Send::Type::Internal {
179198 return keyboard_usage_to_key (Usb::keyboard_vk_to_usage (vk));
180199 }
181200
182- // RCtrl and RAlt will be treated as left ones.
201+ // / - For extended keys, only the lowest byte is returned.
202+ // / - RCtrl and RAlt will be treated as left ones.
183203 constexpr int16_t keyboard_usage_to_key (uint16_t usage_id) {
204+ // Extracted from kbddef.dat in Razer Synapse
205+ //
206+ // Differences from HidP_TranslateUsagesToI8042ScanCodes() and MapVirtualKey():
207+ // vk | razer | HidP_TranslateUsagesToI8042ScanCodes | MapVirtualKey
208+ // --- | --- | --- | ---
209+ // VK_PAUSE (0x13) | 0x1D | 0x1D | MAPVK_VK_TO_VSC: 0 / MAPVK_VK_TO_VSC_EX: 0x1D
210+ // VK_SNAPSHOT (0x2C) | 0x37 | 0x2A / 0x37 | 0x54
211+
184212 if (usage_id <= 115 ) {
185213 constexpr uint16_t table[] = { -1 , 255 , 252 , -3 , 30 , 48 , 46 , 32 , 18 , 33 , 34 , 35 , 23 , 36 , 37 , 38 , 50 , 49 , 24 , 25 , 16 , 19 , 31 , 20 , 22 , 47 , 17 , 45 , 21 , 44 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 28 , 1 , 14 , 15 , 57 , 12 , 13 , 26 , 27 , 43 , 43 , 39 , 40 , 41 , 51 , 52 , 53 , 58 , 59 , 60 , 61 , 62 , 63 , 64 , 65 , 66 , 67 , 68 , 87 , 88 , 55 , 70 , 29 , 82 , 71 , 73 , 83 , 79 , 81 , 77 , 75 , 80 , 72 , 69 , 53 , 55 , 74 , 78 , 28 , 79 , 80 , 81 , 75 , 76 , 77 , 71 , 72 , 73 , 82 , 83 , 86 , 93 , 94 , 89 , 100 , 101 , 102 , 103 , 104 , 105 , 106 , 107 , 108 , 109 , 110 , 118 , -3 , -3 , -3 , -3 , -3 , -3 , -3 , -3 , -3 , -3 , -3 , -3 , -3 , 94 , 95 , 99 , -3 , 126 , -3 , 115 , 112 , 125 , 121 , 123 , 92 , -3 , -3 , -3 , 242 , 241 , 120 , 119 , 118 };
186214 return table[usage_id];
0 commit comments