1+ #include " pch.h"
2+ #include < bit>
3+ #include < cassert>
4+ #include " IbAhkSend.hpp"
5+ using namespace Send ;
6+
7+
8+ DLLAPI bool __stdcall IbSendMouseMove (uint32_t x, uint32_t y, Send::MoveMode mode) {
9+ INPUT input {
10+ .type = INPUT_MOUSE,
11+ .mi {
12+ .dx = std::bit_cast<LONG>(x),
13+ .dy = std::bit_cast<LONG>(y),
14+ .mouseData = 0 ,
15+ .dwFlags = [mode]() -> DWORD {
16+ switch (mode) {
17+ case MoveMode::Absolute: return MOUSEEVENTF_ABSOLUTE;
18+ case MoveMode::Relative: return MOUSEEVENTF_MOVE;
19+ default : assert (false );
20+ }
21+ }(),
22+ .time = 0 ,
23+ .dwExtraInfo = 0
24+ }
25+ };
26+ return IbSendInput (1 , &input, sizeof INPUT);
27+ }
28+
29+ DLLAPI bool __stdcall IbSendMouseClick (Send::MouseButton button) {
30+ INPUT inputs[2 ];
31+ inputs[0 ] = inputs[1 ] = {
32+ .type = INPUT_MOUSE,
33+ .mi {
34+ .dx = 0 ,
35+ .dy = 0 ,
36+ .mouseData = 0 ,
37+ .time = 0 ,
38+ .dwExtraInfo = 0
39+ }
40+ };
41+
42+ switch (button) {
43+ case MouseButton::Left:
44+ inputs[0 ].mi .dwFlags = MOUSEEVENTF_LEFTDOWN;
45+ inputs[1 ].mi .dwFlags = MOUSEEVENTF_LEFTUP;
46+ return IbSendInput (2 , inputs, sizeof INPUT) == 2 ;
47+ case MouseButton::Right:
48+ inputs[0 ].mi .dwFlags = MOUSEEVENTF_RIGHTDOWN;
49+ inputs[1 ].mi .dwFlags = MOUSEEVENTF_RIGHTUP;
50+ return IbSendInput (2 , inputs, sizeof INPUT) == 2 ;
51+ case MouseButton::Middle:
52+ inputs[0 ].mi .dwFlags = MOUSEEVENTF_MIDDLEDOWN;
53+ inputs[1 ].mi .dwFlags = MOUSEEVENTF_MIDDLEUP;
54+ return IbSendInput (2 , inputs, sizeof INPUT) == 2 ;
55+ case MouseButton::XButton1:
56+ inputs[0 ].mi .dwFlags = MOUSEEVENTF_XDOWN;
57+ inputs[1 ].mi .dwFlags = MOUSEEVENTF_XUP;
58+ inputs[0 ].mi .mouseData = inputs[1 ].mi .mouseData = XBUTTON1;
59+ return IbSendInput (2 , inputs, sizeof INPUT) == 2 ;
60+ case MouseButton::XButton2:
61+ inputs[0 ].mi .dwFlags = MOUSEEVENTF_XDOWN;
62+ inputs[1 ].mi .dwFlags = MOUSEEVENTF_XUP;
63+ inputs[0 ].mi .mouseData = inputs[1 ].mi .mouseData = XBUTTON2;
64+ return IbSendInput (2 , inputs, sizeof INPUT) == 2 ;
65+ default :
66+ inputs[0 ].mi .dwFlags = static_cast <DWORD>(button);
67+ return IbSendInput (1 , inputs, sizeof INPUT);
68+ }
69+ }
70+
71+ DLLAPI bool __stdcall IbSendMouseWheel (int32_t movement) {
72+ INPUT input{
73+ .type = INPUT_MOUSE,
74+ .mi {
75+ .dx = 0 ,
76+ .dy = 0 ,
77+ .mouseData = std::bit_cast<DWORD>(movement),
78+ .dwFlags = MOUSEEVENTF_WHEEL,
79+ .time = 0 ,
80+ .dwExtraInfo = 0
81+ }
82+ };
83+ return IbSendInput (1 , &input, sizeof INPUT);
84+ }
85+
86+ DLLAPI bool __stdcall IbSendKeybdDown (uint16_t vk) {
87+ INPUT input{
88+ .type = INPUT_KEYBOARD,
89+ .ki {
90+ .wVk = vk,
91+ .wScan = 0 ,
92+ .dwFlags = 0 ,
93+ .time = 0 ,
94+ .dwExtraInfo = 0
95+ }
96+ };
97+ return IbSendInput (1 , &input, sizeof INPUT);
98+ }
99+
100+ DLLAPI bool __stdcall IbSendKeybdUp (uint16_t vk) {
101+ INPUT input{
102+ .type = INPUT_KEYBOARD,
103+ .ki {
104+ .wVk = vk,
105+ .wScan = 0 ,
106+ .dwFlags = KEYEVENTF_KEYUP,
107+ .time = 0 ,
108+ .dwExtraInfo = 0
109+ }
110+ };
111+ return IbSendInput (1 , &input, sizeof INPUT);
112+ }
113+
114+ DLLAPI bool __stdcall IbSendKeybdDownUp (uint16_t vk, Send::KeyboardModifiers modifiers) {
115+ constexpr INPUT blank_input = INPUT{ .type = INPUT_KEYBOARD, .ki { 0 , 0 , 0 , 0 , 0 }};
116+
117+ INPUT inputs[18 ]; // 720 bytes
118+ uint32_t i = 0 ;
119+
120+ #define CODE_GENERATE (vk, member ) \
121+ if (modifiers.member ) { \
122+ inputs[i] = blank_input; \
123+ inputs[i].ki .wVk = vk; \
124+ i++; \
125+ }
126+
127+ CODE_GENERATE (VK_LCONTROL, LCtrl)
128+ CODE_GENERATE (VK_RCONTROL, RCtrl)
129+ CODE_GENERATE (VK_LSHIFT, LShift)
130+ CODE_GENERATE (VK_RSHIFT, RShift)
131+ CODE_GENERATE (VK_LMENU, LAlt)
132+ CODE_GENERATE (VK_RMENU, RAlt)
133+ CODE_GENERATE (VK_LWIN, LWin)
134+ CODE_GENERATE (VK_RWIN, RWin)
135+ #undef CODE_GENERATE
136+ inputs[i] = blank_input;
137+ inputs[i].ki .wVk = vk;
138+ i++;
139+
140+ inputs[i] = inputs[i-1 ];
141+ inputs[i].ki .dwFlags = KEYEVENTF_KEYUP;
142+ i++;
143+ #define CODE_GENERATE (vk, member ) \
144+ if (modifiers.member ) { \
145+ inputs[i] = blank_input; \
146+ inputs[i].ki .wVk = vk; \
147+ inputs[i].ki .dwFlags = KEYEVENTF_KEYUP; \
148+ i++; \
149+ }
150+
151+ CODE_GENERATE (VK_RWIN, RWin)
152+ CODE_GENERATE (VK_LWIN, LWin)
153+ CODE_GENERATE (VK_RMENU, RAlt)
154+ CODE_GENERATE (VK_LMENU, LAlt)
155+ CODE_GENERATE (VK_RSHIFT, RShift)
156+ CODE_GENERATE (VK_LSHIFT, LShift)
157+ CODE_GENERATE (VK_RCONTROL, RCtrl)
158+ CODE_GENERATE (VK_LCONTROL, LCtrl)
159+ #undef CODE_GENERATE
160+
161+ return IbSendInput (i, inputs, sizeof INPUT) == i;
162+ }
0 commit comments