-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathKeySender.cs
More file actions
144 lines (124 loc) · 4.21 KB
/
KeySender.cs
File metadata and controls
144 lines (124 loc) · 4.21 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
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
using System.Runtime.InteropServices;
namespace PCRemoteControlServer
{
public static class KeySender
{
[StructLayout(LayoutKind.Sequential)]
private struct INPUT
{
public uint type;
public InputUnion U;
}
[StructLayout(LayoutKind.Explicit)]
private struct InputUnion
{
[FieldOffset(0)]
public MOUSEINPUT mi;
[FieldOffset(0)]
public KEYBDINPUT ki;
[FieldOffset(0)]
public HARDWAREINPUT hi;
}
[StructLayout(LayoutKind.Sequential)]
private struct MOUSEINPUT
{
public int dx;
public int dy;
public uint mouseData;
public uint dwFlags;
public uint time;
public IntPtr dwExtraInfo;
}
[StructLayout(LayoutKind.Sequential)]
private struct KEYBDINPUT
{
public ushort wVk;
public ushort wScan;
public uint dwFlags;
public uint time;
public IntPtr dwExtraInfo;
}
[StructLayout(LayoutKind.Sequential)]
private struct HARDWAREINPUT
{
public uint uMsg;
public ushort wParamL;
public ushort wParamH;
}
[DllImport("user32.dll", SetLastError = true)]
private static extern uint SendInput(uint nInputs, INPUT[] pInputs, int cbSize);
private const uint INPUT_MOUSE = 0;
private const uint INPUT_KEYBOARD = 1;
private const uint INPUT_HARDWARE = 2;
private const uint KEYEVENTF_KEYUP = 0x0002;
private const uint KEYEVENTF_EXTENDEDKEY = 0x0001;
public static void SendKey(ushort vk, bool extended = false)
{
INPUT[] inputs = new INPUT[2];
// key down
inputs[0].type = INPUT_KEYBOARD;
inputs[0].U.ki = new KEYBDINPUT
{
wVk = vk,
wScan = 0,
dwFlags = extended ? KEYEVENTF_EXTENDEDKEY : 0,
time = 0,
dwExtraInfo = IntPtr.Zero
};
// key up
inputs[1].type = INPUT_KEYBOARD;
inputs[1].U.ki = new KEYBDINPUT
{
wVk = vk,
wScan = 0,
dwFlags = (extended ? KEYEVENTF_EXTENDEDKEY : 0) | KEYEVENTF_KEYUP,
time = 0,
dwExtraInfo = IntPtr.Zero
};
uint result = SendInput((uint)inputs.Length, inputs, Marshal.SizeOf(typeof(INPUT)));
if (result == 0)
{
int error = Marshal.GetLastWin32Error();
KeyCommandExecutor.Log("SendInput failed. Error: " + error);
}
}
public static void SendKeyDown(ushort vk, bool extended = false)
{
INPUT[] inputs = new INPUT[1];
inputs[0].type = INPUT_KEYBOARD;
inputs[0].U.ki = new KEYBDINPUT
{
wVk = vk,
wScan = 0,
dwFlags = extended ? KEYEVENTF_EXTENDEDKEY : 0,
time = 0,
dwExtraInfo = IntPtr.Zero
};
uint result = SendInput((uint)inputs.Length, inputs, Marshal.SizeOf(typeof(INPUT)));
if (result == 0)
{
int error = Marshal.GetLastWin32Error();
KeyCommandExecutor.Log("SendKeyDown failed. Error: " + error);
}
}
public static void SendKeyUp(ushort vk, bool extended = false)
{
INPUT[] inputs = new INPUT[1];
inputs[0].type = INPUT_KEYBOARD;
inputs[0].U.ki = new KEYBDINPUT
{
wVk = vk,
wScan = 0,
dwFlags = (extended ? KEYEVENTF_EXTENDEDKEY : 0) | KEYEVENTF_KEYUP,
time = 0,
dwExtraInfo = IntPtr.Zero
};
uint result = SendInput((uint)inputs.Length, inputs, Marshal.SizeOf(typeof(INPUT)));
if (result == 0)
{
int error = Marshal.GetLastWin32Error();
KeyCommandExecutor.Log("SendKeyUp failed. Error: " + error);
}
}
}
}