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