A game about forced loneliness, made by TACStudios
1#if UNITY_STANDALONE_WIN || UNITY_EDITOR_WIN
2
3using System;
4using System.Runtime.InteropServices;
5
6/// <summary>
7/// Used to send fake input events to Windows via user32.dll.
8/// </summary>
9internal static class WinUserInput
10{
11 [DllImport("user32.dll")]
12 public static extern uint SendInput(
13 uint nInputs,
14 [MarshalAs(UnmanagedType.LPArray), In] INPUT[] pInputs,
15 int cbSize);
16
17 [StructLayout(LayoutKind.Sequential)]
18 public struct INPUT
19 {
20 public InputType type;
21 public InputUnion U;
22 public static int Size
23 {
24 get { return Marshal.SizeOf(typeof(INPUT)); }
25 }
26 }
27
28 [StructLayout(LayoutKind.Explicit)]
29 public struct InputUnion
30 {
31 [FieldOffset(0)]
32 public MOUSEINPUT mi;
33 [FieldOffset(0)]
34 public KEYBDINPUT ki;
35 [FieldOffset(0)]
36 public HARDWAREINPUT hi;
37 }
38
39 [StructLayout(LayoutKind.Sequential)]
40 public struct MOUSEINPUT
41 {
42 public int dx;
43 public int dy;
44 public MouseEventDataXButtons mouseData;
45 public MOUSEEVENTF dwFlags;
46 public uint time;
47 public UIntPtr dwExtraInfo;
48 }
49
50 public enum InputType : uint
51 {
52 INPUT_MOUSE,
53 INPUT_KEYBOARD,
54 INPUT_HARDWARE
55 }
56
57 [Flags]
58 public enum MouseEventDataXButtons : uint
59 {
60 Nothing = 0x00000000,
61 XBUTTON1 = 0x00000001,
62 XBUTTON2 = 0x00000002
63 }
64
65 [Flags]
66 public enum MOUSEEVENTF : uint
67 {
68 ABSOLUTE = 0x8000,
69 HWHEEL = 0x01000,
70 MOVE = 0x0001,
71 MOVE_NOCOALESCE = 0x2000,
72 LEFTDOWN = 0x0002,
73 LEFTUP = 0x0004,
74 RIGHTDOWN = 0x0008,
75 RIGHTUP = 0x0010,
76 MIDDLEDOWN = 0x0020,
77 MIDDLEUP = 0x0040,
78 VIRTUALDESK = 0x4000,
79 WHEEL = 0x0800,
80 XDOWN = 0x0080,
81 XUP = 0x0100
82 }
83
84 [StructLayout(LayoutKind.Sequential)]
85 public struct KEYBDINPUT
86 {
87 public VirtualKeyShort wVk;
88 public ScanCodeShort wScan;
89 public KEYEVENTF dwFlags;
90 public int time;
91 public UIntPtr dwExtraInfo;
92 }
93
94 [Flags]
95 public enum KEYEVENTF : uint
96 {
97 EXTENDEDKEY = 0x0001,
98 KEYUP = 0x0002,
99 SCANCODE = 0x0008,
100 UNICODE = 0x0004
101 }
102
103 public enum VirtualKeyShort : short
104 {
105 LBUTTON = 0x01,
106 RBUTTON = 0x02,
107 CANCEL = 0x03,
108 MBUTTON = 0x04,
109 XBUTTON1 = 0x05,
110 XBUTTON2 = 0x06,
111 BACK = 0x08,
112 TAB = 0x09,
113 CLEAR = 0x0C,
114 RETURN = 0x0D,
115 SHIFT = 0x10,
116 CONTROL = 0x11,
117 MENU = 0x12,
118 PAUSE = 0x13,
119 CAPITAL = 0x14,
120 KANA = 0x15,
121 HANGUL = 0x15,
122 JUNJA = 0x17,
123 FINAL = 0x18,
124 HANJA = 0x19,
125 KANJI = 0x19,
126 ESCAPE = 0x1B,
127 CONVERT = 0x1C,
128 NONCONVERT = 0x1D,
129 ACCEPT = 0x1E,
130 MODECHANGE = 0x1F,
131 SPACE = 0x20,
132 PRIOR = 0x21,
133 NEXT = 0x22,
134 END = 0x23,
135 HOME = 0x24,
136 LEFT = 0x25,
137 UP = 0x26,
138 RIGHT = 0x27,
139 DOWN = 0x28,
140 SELECT = 0x29,
141 PRINT = 0x2A,
142 EXECUTE = 0x2B,
143 SNAPSHOT = 0x2C,
144 INSERT = 0x2D,
145 DELETE = 0x2E,
146 HELP = 0x2F,
147 KEY_0 = 0x30,
148 KEY_1 = 0x31,
149 KEY_2 = 0x32,
150 KEY_3 = 0x33,
151 KEY_4 = 0x34,
152 KEY_5 = 0x35,
153 KEY_6 = 0x36,
154 KEY_7 = 0x37,
155 KEY_8 = 0x38,
156 KEY_9 = 0x39,
157 KEY_A = 0x41,
158 KEY_B = 0x42,
159 KEY_C = 0x43,
160 KEY_D = 0x44,
161 KEY_E = 0x45,
162 KEY_F = 0x46,
163 KEY_G = 0x47,
164 KEY_H = 0x48,
165 KEY_I = 0x49,
166 KEY_J = 0x4A,
167 KEY_K = 0x4B,
168 KEY_L = 0x4C,
169 KEY_M = 0x4D,
170 KEY_N = 0x4E,
171 KEY_O = 0x4F,
172 KEY_P = 0x50,
173 KEY_Q = 0x51,
174 KEY_R = 0x52,
175 KEY_S = 0x53,
176 KEY_T = 0x54,
177 KEY_U = 0x55,
178 KEY_V = 0x56,
179 KEY_W = 0x57,
180 KEY_X = 0x58,
181 KEY_Y = 0x59,
182 KEY_Z = 0x5A,
183 LWIN = 0x5B,
184 RWIN = 0x5C,
185 APPS = 0x5D,
186 SLEEP = 0x5F,
187 NUMPAD0 = 0x60,
188 NUMPAD1 = 0x61,
189 NUMPAD2 = 0x62,
190 NUMPAD3 = 0x63,
191 NUMPAD4 = 0x64,
192 NUMPAD5 = 0x65,
193 NUMPAD6 = 0x66,
194 NUMPAD7 = 0x67,
195 NUMPAD8 = 0x68,
196 NUMPAD9 = 0x69,
197 MULTIPLY = 0x6A,
198 ADD = 0x6B,
199 SEPARATOR = 0x6C,
200 SUBTRACT = 0x6D,
201 DECIMAL = 0x6E,
202 DIVIDE = 0x6F,
203 F1 = 0x70,
204 F2 = 0x71,
205 F3 = 0x72,
206 F4 = 0x73,
207 F5 = 0x74,
208 F6 = 0x75,
209 F7 = 0x76,
210 F8 = 0x77,
211 F9 = 0x78,
212 F10 = 0x79,
213 F11 = 0x7A,
214 F12 = 0x7B,
215 F13 = 0x7C,
216 F14 = 0x7D,
217 F15 = 0x7E,
218 F16 = 0x7F,
219 F17 = 0x80,
220 F18 = 0x81,
221 F19 = 0x82,
222 F20 = 0x83,
223 F21 = 0x84,
224 F22 = 0x85,
225 F23 = 0x86,
226 F24 = 0x87,
227 NUMLOCK = 0x90,
228 SCROLL = 0x91,
229 LSHIFT = 0xA0,
230 RSHIFT = 0xA1,
231 LCONTROL = 0xA2,
232 RCONTROL = 0xA3,
233 LMENU = 0xA4,
234 RMENU = 0xA5,
235 BROWSER_BACK = 0xA6,
236 BROWSER_FORWARD = 0xA7,
237 BROWSER_REFRESH = 0xA8,
238 BROWSER_STOP = 0xA9,
239 BROWSER_SEARCH = 0xAA,
240 BROWSER_FAVORITES = 0xAB,
241 BROWSER_HOME = 0xAC,
242 VOLUME_MUTE = 0xAD,
243 VOLUME_DOWN = 0xAE,
244 VOLUME_UP = 0xAF,
245 MEDIA_NEXT_TRACK = 0xB0,
246 MEDIA_PREV_TRACK = 0xB1,
247 MEDIA_STOP = 0xB2,
248 MEDIA_PLAY_PAUSE = 0xB3,
249 LAUNCH_MAIL = 0xB4,
250 LAUNCH_MEDIA_SELECT = 0xB5,
251 LAUNCH_APP1 = 0xB6,
252 LAUNCH_APP2 = 0xB7,
253 OEM_1 = 0xBA,
254 OEM_PLUS = 0xBB,
255 OEM_COMMA = 0xBC,
256 OEM_MINUS = 0xBD,
257 OEM_PERIOD = 0xBE,
258 OEM_2 = 0xBF,
259 OEM_3 = 0xC0,
260 OEM_4 = 0xDB,
261 OEM_5 = 0xDC,
262 OEM_6 = 0xDD,
263 OEM_7 = 0xDE,
264 OEM_8 = 0xDF,
265 OEM_102 = 0xE2,
266 PROCESSKEY = 0xE5,
267 PACKET = 0xE7,
268 ATTN = 0xF6,
269 CRSEL = 0xF7,
270 EXSEL = 0xF8,
271 EREOF = 0xF9,
272 PLAY = 0xFA,
273 ZOOM = 0xFB,
274 NONAME = 0xFC,
275 PA1 = 0xFD,
276 OEM_CLEAR = 0xFE
277 }
278
279 public enum ScanCodeShort : short
280 {
281 LBUTTON = 0,
282 RBUTTON = 0,
283 CANCEL = 70,
284 MBUTTON = 0,
285 XBUTTON1 = 0,
286 XBUTTON2 = 0,
287 BACK = 14,
288 TAB = 15,
289 CLEAR = 76,
290 RETURN = 28,
291 SHIFT = 42,
292 CONTROL = 29,
293 MENU = 56,
294 PAUSE = 0,
295 CAPITAL = 58,
296 KANA = 0,
297 HANGUL = 0,
298 JUNJA = 0,
299 FINAL = 0,
300 HANJA = 0,
301 KANJI = 0,
302 ESCAPE = 1,
303 CONVERT = 0,
304 NONCONVERT = 0,
305 ACCEPT = 0,
306 MODECHANGE = 0,
307 SPACE = 57,
308 PRIOR = 73,
309 NEXT = 81,
310 END = 79,
311 HOME = 71,
312 LEFT = 75,
313 UP = 72,
314 RIGHT = 77,
315 DOWN = 80,
316 SELECT = 0,
317 PRINT = 0,
318 EXECUTE = 0,
319 SNAPSHOT = 84,
320 INSERT = 82,
321 DELETE = 83,
322 HELP = 99,
323 KEY_0 = 11,
324 KEY_1 = 2,
325 KEY_2 = 3,
326 KEY_3 = 4,
327 KEY_4 = 5,
328 KEY_5 = 6,
329 KEY_6 = 7,
330 KEY_7 = 8,
331 KEY_8 = 9,
332 KEY_9 = 10,
333 KEY_A = 30,
334 KEY_B = 48,
335 KEY_C = 46,
336 KEY_D = 32,
337 KEY_E = 18,
338 KEY_F = 33,
339 KEY_G = 34,
340 KEY_H = 35,
341 KEY_I = 23,
342 KEY_J = 36,
343 KEY_K = 37,
344 KEY_L = 38,
345 KEY_M = 50,
346 KEY_N = 49,
347 KEY_O = 24,
348 KEY_P = 25,
349 KEY_Q = 16,
350 KEY_R = 19,
351 KEY_S = 31,
352 KEY_T = 20,
353 KEY_U = 22,
354 KEY_V = 47,
355 KEY_W = 17,
356 KEY_X = 45,
357 KEY_Y = 21,
358 KEY_Z = 44,
359 LWIN = 91,
360 RWIN = 92,
361 APPS = 93,
362 SLEEP = 95,
363 NUMPAD0 = 82,
364 NUMPAD1 = 79,
365 NUMPAD2 = 80,
366 NUMPAD3 = 81,
367 NUMPAD4 = 75,
368 NUMPAD5 = 76,
369 NUMPAD6 = 77,
370 NUMPAD7 = 71,
371 NUMPAD8 = 72,
372 NUMPAD9 = 73,
373 MULTIPLY = 55,
374 ADD = 78,
375 SEPARATOR = 0,
376 SUBTRACT = 74,
377 DECIMAL = 83,
378 DIVIDE = 53,
379 F1 = 59,
380 F2 = 60,
381 F3 = 61,
382 F4 = 62,
383 F5 = 63,
384 F6 = 64,
385 F7 = 65,
386 F8 = 66,
387 F9 = 67,
388 F10 = 68,
389 F11 = 87,
390 F12 = 88,
391 F13 = 100,
392 F14 = 101,
393 F15 = 102,
394 F16 = 103,
395 F17 = 104,
396 F18 = 105,
397 F19 = 106,
398 F20 = 107,
399 F21 = 108,
400 F22 = 109,
401 F23 = 110,
402 F24 = 118,
403 NUMLOCK = 69,
404 SCROLL = 70,
405 LSHIFT = 42,
406 RSHIFT = 54,
407 LCONTROL = 29,
408 RCONTROL = 29,
409 LMENU = 56,
410 RMENU = 56,
411 BROWSER_BACK = 106,
412 BROWSER_FORWARD = 105,
413 BROWSER_REFRESH = 103,
414 BROWSER_STOP = 104,
415 BROWSER_SEARCH = 101,
416 BROWSER_FAVORITES = 102,
417 BROWSER_HOME = 50,
418 VOLUME_MUTE = 32,
419 VOLUME_DOWN = 46,
420 VOLUME_UP = 48,
421 MEDIA_NEXT_TRACK = 25,
422 MEDIA_PREV_TRACK = 16,
423 MEDIA_STOP = 36,
424 MEDIA_PLAY_PAUSE = 34,
425 LAUNCH_MAIL = 108,
426 LAUNCH_MEDIA_SELECT = 109,
427 LAUNCH_APP1 = 107,
428 LAUNCH_APP2 = 33,
429 OEM_1 = 39,
430 OEM_PLUS = 13,
431 OEM_COMMA = 51,
432 OEM_MINUS = 12,
433 OEM_PERIOD = 52,
434 OEM_2 = 53,
435 OEM_3 = 41,
436 OEM_4 = 26,
437 OEM_5 = 43,
438 OEM_6 = 27,
439 OEM_7 = 40,
440 OEM_8 = 0,
441 OEM_102 = 86,
442 PROCESSKEY = 0,
443 PACKET = 0,
444 ATTN = 0,
445 CRSEL = 0,
446 EXSEL = 0,
447 EREOF = 93,
448 PLAY = 0,
449 ZOOM = 98,
450 NONAME = 0,
451 PA1 = 0,
452 OEM_CLEAR = 0,
453 }
454
455 [StructLayout(LayoutKind.Sequential)]
456 public struct HARDWAREINPUT
457 {
458 public int uMsg;
459 public short wParamL;
460 public short wParamH;
461 }
462
463 /// <summary>
464 /// Emulate an event sent over RDP.
465 /// </summary>
466 /// <param name="x"></param>
467 /// <param name="y"></param>
468 public static void SendRDPMouseMoveEvent(int x, int y)
469 {
470 var mouseInput = new INPUT { type = InputType.INPUT_MOUSE };
471 mouseInput.U.mi.dx = x;
472 mouseInput.U.mi.dy = y;
473 mouseInput.U.mi.dwFlags = MOUSEEVENTF.ABSOLUTE | MOUSEEVENTF.VIRTUALDESK | MOUSEEVENTF.MOVE;
474 SendInput(1, new INPUT[] { mouseInput }, INPUT.Size);
475 }
476
477 /// <summary>
478 /// Emulate a normal mouse move event with relative coordinates.
479 /// </summary>
480 /// <param name="x"></param>
481 /// <param name="y"></param>
482 public static void SendMouseMoveEvent(int x, int y)
483 {
484 var mouseInput = new INPUT { type = InputType.INPUT_MOUSE };
485 mouseInput.U.mi.dx = x;
486 mouseInput.U.mi.dy = y;
487 mouseInput.U.mi.dwFlags = MOUSEEVENTF.MOVE;
488 SendInput(1, new INPUT[] { mouseInput }, INPUT.Size);
489 }
490}
491
492#endif