Skip to content

Commit 9cdf5ae

Browse files
committed
AhkDll: Add API 3
1 parent 7c989c5 commit 9cdf5ae

7 files changed

Lines changed: 276 additions & 43 deletions

File tree

AhkDll.Test/AhkDll.Test.cpp

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -102,20 +102,19 @@ class KeyboardTest : public InitTest<TypeV>
102102
void TestKeyboardLatency() {
103103
Measure measure;
104104

105-
INPUT input[2];
105+
INPUT inputs[2];
106106

107-
input[0].type = INPUT_KEYBOARD;
108-
input[0].ki = {};
109-
input[0].ki.wVk = VK_F12;
107+
inputs[0].type = INPUT_KEYBOARD;
108+
inputs[0].ki = {};
109+
inputs[0].ki.wVk = VK_F12;
110110

111-
input[1].type = INPUT_KEYBOARD;
112-
input[1].ki = {};
113-
input[1].ki.wVk = VK_F12;
114-
input[1].ki.dwFlags = KEYEVENTF_KEYUP;
111+
inputs[1] = inputs[0];
112+
inputs[1].ki.dwFlags = KEYEVENTF_KEYUP;
115113

116114
capture = true;
117115
measure.begin();
118-
IbSendInput(2, input, sizeof INPUT);
116+
IbSendInput(2, inputs, sizeof INPUT);
117+
119118
uint64_t t1 = measure.end();
120119

121120
measure.begin();

AhkDll/API 2.cpp

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
#include "pch.h"
2+
#include <bit>
3+
#include "IbAhkSend.hpp"
4+
using namespace Send;
5+
6+
7+
DLLAPI VOID WINAPI IbSend_mouse_event(
8+
_In_ DWORD dwFlags,
9+
_In_ DWORD dx,
10+
_In_ DWORD dy,
11+
_In_ DWORD dwData,
12+
_In_ ULONG_PTR dwExtraInfo
13+
) {
14+
INPUT input{
15+
.type = INPUT_MOUSE,
16+
.mi {
17+
.dx = std::bit_cast<LONG>(dx),
18+
.dy = std::bit_cast<LONG>(dy),
19+
.mouseData = dwData,
20+
.dwFlags = dwFlags,
21+
.time = 0,
22+
.dwExtraInfo = dwExtraInfo
23+
}
24+
};
25+
IbSendInput(1, &input, sizeof INPUT);
26+
}
27+
28+
DLLAPI VOID WINAPI IbSend_keybd_event(
29+
_In_ BYTE bVk,
30+
_In_ BYTE bScan,
31+
_In_ DWORD dwFlags,
32+
_In_ ULONG_PTR dwExtraInfo
33+
) {
34+
INPUT input{
35+
.type = INPUT_KEYBOARD,
36+
.ki {
37+
.wVk = bVk,
38+
.wScan = bScan,
39+
.dwFlags = dwFlags,
40+
.time = 0,
41+
.dwExtraInfo = dwExtraInfo
42+
}
43+
};
44+
IbSendInput(1, &input, sizeof INPUT);
45+
}

AhkDll/API 3.cpp

Lines changed: 162 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,162 @@
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+
}

AhkDll/AhkDll.vcxproj

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,8 @@
176176
<ClInclude Include="SendTypes\Types.hpp" />
177177
</ItemGroup>
178178
<ItemGroup>
179+
<ClCompile Include="API 2.cpp" />
180+
<ClCompile Include="API 3.cpp" />
179181
<ClCompile Include="dllmain.cpp" />
180182
<ClCompile Include="pch.cpp">
181183
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader>

AhkDll/AhkDll.vcxproj.filters

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,5 +53,11 @@
5353
<ClCompile Include="pch.cpp">
5454
<Filter>Source Files</Filter>
5555
</ClCompile>
56+
<ClCompile Include="API 3.cpp">
57+
<Filter>Source Files</Filter>
58+
</ClCompile>
59+
<ClCompile Include="API 2.cpp">
60+
<Filter>Source Files</Filter>
61+
</ClCompile>
5662
</ItemGroup>
5763
</Project>

AhkDll/IbAhkSend.hpp

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,4 +75,57 @@ DLLAPI VOID WINAPI IbSend_keybd_event(
7575
_In_ ULONG_PTR dwExtraInfo
7676
);
7777

78+
#pragma endregion
79+
80+
81+
#pragma region API 3
82+
83+
namespace Send {
84+
enum class MoveMode : uint32_t {
85+
Absolute, //1
86+
Relative //2
87+
};
88+
89+
enum class MouseButton : uint32_t {
90+
LeftDown = MOUSEEVENTF_LEFTDOWN, //0x02
91+
LeftUp = MOUSEEVENTF_LEFTUP, //0x04
92+
Left = LeftDown | LeftUp, //0x06
93+
94+
RightDown = MOUSEEVENTF_RIGHTDOWN, //0x08
95+
RightUp = MOUSEEVENTF_RIGHTUP, //0x10
96+
Right = RightDown | RightUp, //0x18
97+
98+
MiddleDown = MOUSEEVENTF_MIDDLEDOWN, //0x20
99+
MiddleUp = MOUSEEVENTF_MIDDLEUP, //0x40
100+
Middle = MiddleDown | MiddleUp, //0x60
101+
102+
XButton1Down = MOUSEEVENTF_XDOWN | XBUTTON1, //0x81
103+
XButton1Up = MOUSEEVENTF_XUP | XBUTTON1, //0x101
104+
XButton1 = XButton1Down | XButton1Up, //0x181
105+
106+
XButton2Down = MOUSEEVENTF_XDOWN | XBUTTON2, //0x82
107+
XButton2Up = MOUSEEVENTF_XUP | XBUTTON2, //0x102
108+
XButton2 = XButton2Down | XButton2Up, //0x182
109+
};
110+
111+
struct KeyboardModifiers {
112+
bool LCtrl : 1; //0x01
113+
bool LShift : 1; //0x02
114+
bool LAlt : 1; //0x04
115+
bool LWin : 1; //0x08
116+
bool RCtrl : 1; //0x10
117+
bool RShift : 1; //0x20
118+
bool RAlt : 1; //0x40
119+
bool RWin : 1; //0x80
120+
};
121+
}
122+
123+
DLLAPI bool __stdcall IbSendMouseMove(uint32_t x, uint32_t y, Send::MoveMode mode);
124+
DLLAPI bool __stdcall IbSendMouseClick(Send::MouseButton button);
125+
DLLAPI bool __stdcall IbSendMouseWheel(int32_t movement);
126+
127+
DLLAPI bool __stdcall IbSendKeybdDown(uint16_t vk);
128+
DLLAPI bool __stdcall IbSendKeybdUp(uint16_t vk);
129+
DLLAPI bool __stdcall IbSendKeybdDownUp(uint16_t vk, Send::KeyboardModifiers modifiers);
130+
78131
#pragma endregion

AhkDll/dllmain.cpp

Lines changed: 0 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -151,38 +151,4 @@ DLLAPI UINT WINAPI IbSendInput(
151151
_In_ int cbSize
152152
) {
153153
return send->send_input(pInputs, cInputs);
154-
}
155-
156-
DLLAPI VOID WINAPI IbSend_mouse_event(
157-
_In_ DWORD dwFlags,
158-
_In_ DWORD dx,
159-
_In_ DWORD dy,
160-
_In_ DWORD dwData,
161-
_In_ ULONG_PTR dwExtraInfo
162-
) {
163-
INPUT input;
164-
input.type = INPUT_MOUSE;
165-
input.mi.dx = dx;
166-
input.mi.dy = dy;
167-
input.mi.mouseData = dwData;
168-
input.mi.dwFlags = dwFlags;
169-
input.mi.time = 0;
170-
input.mi.dwExtraInfo = dwExtraInfo;
171-
IbSendInput(1, &input, sizeof INPUT);
172-
}
173-
174-
DLLAPI VOID WINAPI IbSend_keybd_event(
175-
_In_ BYTE bVk,
176-
_In_ BYTE bScan,
177-
_In_ DWORD dwFlags,
178-
_In_ ULONG_PTR dwExtraInfo
179-
) {
180-
INPUT input;
181-
input.type = INPUT_KEYBOARD;
182-
input.ki.wVk = bVk;
183-
input.ki.wScan = bScan;
184-
input.ki.dwFlags = dwFlags;
185-
input.ki.time = 0;
186-
input.ki.dwExtraInfo = dwExtraInfo;
187-
IbSendInput(1, &input, sizeof INPUT);
188154
}

0 commit comments

Comments
 (0)