123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492 |
- #if UNITY_STANDALONE_WIN || UNITY_EDITOR_WIN
-
- using System;
- using System.Runtime.InteropServices;
-
- /// <summary>
- /// Used to send fake input events to Windows via user32.dll.
- /// </summary>
- internal static class WinUserInput
- {
- [DllImport("user32.dll")]
- public static extern uint SendInput(
- uint nInputs,
- [MarshalAs(UnmanagedType.LPArray), In] INPUT[] pInputs,
- int cbSize);
-
- [StructLayout(LayoutKind.Sequential)]
- public struct INPUT
- {
- public InputType type;
- public InputUnion U;
- public static int Size
- {
- get { return Marshal.SizeOf(typeof(INPUT)); }
- }
- }
-
- [StructLayout(LayoutKind.Explicit)]
- public struct InputUnion
- {
- [FieldOffset(0)]
- public MOUSEINPUT mi;
- [FieldOffset(0)]
- public KEYBDINPUT ki;
- [FieldOffset(0)]
- public HARDWAREINPUT hi;
- }
-
- [StructLayout(LayoutKind.Sequential)]
- public struct MOUSEINPUT
- {
- public int dx;
- public int dy;
- public MouseEventDataXButtons mouseData;
- public MOUSEEVENTF dwFlags;
- public uint time;
- public UIntPtr dwExtraInfo;
- }
-
- public enum InputType : uint
- {
- INPUT_MOUSE,
- INPUT_KEYBOARD,
- INPUT_HARDWARE
- }
-
- [Flags]
- public enum MouseEventDataXButtons : uint
- {
- Nothing = 0x00000000,
- XBUTTON1 = 0x00000001,
- XBUTTON2 = 0x00000002
- }
-
- [Flags]
- public enum MOUSEEVENTF : uint
- {
- ABSOLUTE = 0x8000,
- HWHEEL = 0x01000,
- MOVE = 0x0001,
- MOVE_NOCOALESCE = 0x2000,
- LEFTDOWN = 0x0002,
- LEFTUP = 0x0004,
- RIGHTDOWN = 0x0008,
- RIGHTUP = 0x0010,
- MIDDLEDOWN = 0x0020,
- MIDDLEUP = 0x0040,
- VIRTUALDESK = 0x4000,
- WHEEL = 0x0800,
- XDOWN = 0x0080,
- XUP = 0x0100
- }
-
- [StructLayout(LayoutKind.Sequential)]
- public struct KEYBDINPUT
- {
- public VirtualKeyShort wVk;
- public ScanCodeShort wScan;
- public KEYEVENTF dwFlags;
- public int time;
- public UIntPtr dwExtraInfo;
- }
-
- [Flags]
- public enum KEYEVENTF : uint
- {
- EXTENDEDKEY = 0x0001,
- KEYUP = 0x0002,
- SCANCODE = 0x0008,
- UNICODE = 0x0004
- }
-
- public enum VirtualKeyShort : short
- {
- LBUTTON = 0x01,
- RBUTTON = 0x02,
- CANCEL = 0x03,
- MBUTTON = 0x04,
- XBUTTON1 = 0x05,
- XBUTTON2 = 0x06,
- BACK = 0x08,
- TAB = 0x09,
- CLEAR = 0x0C,
- RETURN = 0x0D,
- SHIFT = 0x10,
- CONTROL = 0x11,
- MENU = 0x12,
- PAUSE = 0x13,
- CAPITAL = 0x14,
- KANA = 0x15,
- HANGUL = 0x15,
- JUNJA = 0x17,
- FINAL = 0x18,
- HANJA = 0x19,
- KANJI = 0x19,
- ESCAPE = 0x1B,
- CONVERT = 0x1C,
- NONCONVERT = 0x1D,
- ACCEPT = 0x1E,
- MODECHANGE = 0x1F,
- SPACE = 0x20,
- PRIOR = 0x21,
- NEXT = 0x22,
- END = 0x23,
- HOME = 0x24,
- LEFT = 0x25,
- UP = 0x26,
- RIGHT = 0x27,
- DOWN = 0x28,
- SELECT = 0x29,
- PRINT = 0x2A,
- EXECUTE = 0x2B,
- SNAPSHOT = 0x2C,
- INSERT = 0x2D,
- DELETE = 0x2E,
- HELP = 0x2F,
- KEY_0 = 0x30,
- KEY_1 = 0x31,
- KEY_2 = 0x32,
- KEY_3 = 0x33,
- KEY_4 = 0x34,
- KEY_5 = 0x35,
- KEY_6 = 0x36,
- KEY_7 = 0x37,
- KEY_8 = 0x38,
- KEY_9 = 0x39,
- KEY_A = 0x41,
- KEY_B = 0x42,
- KEY_C = 0x43,
- KEY_D = 0x44,
- KEY_E = 0x45,
- KEY_F = 0x46,
- KEY_G = 0x47,
- KEY_H = 0x48,
- KEY_I = 0x49,
- KEY_J = 0x4A,
- KEY_K = 0x4B,
- KEY_L = 0x4C,
- KEY_M = 0x4D,
- KEY_N = 0x4E,
- KEY_O = 0x4F,
- KEY_P = 0x50,
- KEY_Q = 0x51,
- KEY_R = 0x52,
- KEY_S = 0x53,
- KEY_T = 0x54,
- KEY_U = 0x55,
- KEY_V = 0x56,
- KEY_W = 0x57,
- KEY_X = 0x58,
- KEY_Y = 0x59,
- KEY_Z = 0x5A,
- LWIN = 0x5B,
- RWIN = 0x5C,
- APPS = 0x5D,
- SLEEP = 0x5F,
- NUMPAD0 = 0x60,
- NUMPAD1 = 0x61,
- NUMPAD2 = 0x62,
- NUMPAD3 = 0x63,
- NUMPAD4 = 0x64,
- NUMPAD5 = 0x65,
- NUMPAD6 = 0x66,
- NUMPAD7 = 0x67,
- NUMPAD8 = 0x68,
- NUMPAD9 = 0x69,
- MULTIPLY = 0x6A,
- ADD = 0x6B,
- SEPARATOR = 0x6C,
- SUBTRACT = 0x6D,
- DECIMAL = 0x6E,
- DIVIDE = 0x6F,
- F1 = 0x70,
- F2 = 0x71,
- F3 = 0x72,
- F4 = 0x73,
- F5 = 0x74,
- F6 = 0x75,
- F7 = 0x76,
- F8 = 0x77,
- F9 = 0x78,
- F10 = 0x79,
- F11 = 0x7A,
- F12 = 0x7B,
- F13 = 0x7C,
- F14 = 0x7D,
- F15 = 0x7E,
- F16 = 0x7F,
- F17 = 0x80,
- F18 = 0x81,
- F19 = 0x82,
- F20 = 0x83,
- F21 = 0x84,
- F22 = 0x85,
- F23 = 0x86,
- F24 = 0x87,
- NUMLOCK = 0x90,
- SCROLL = 0x91,
- LSHIFT = 0xA0,
- RSHIFT = 0xA1,
- LCONTROL = 0xA2,
- RCONTROL = 0xA3,
- LMENU = 0xA4,
- RMENU = 0xA5,
- BROWSER_BACK = 0xA6,
- BROWSER_FORWARD = 0xA7,
- BROWSER_REFRESH = 0xA8,
- BROWSER_STOP = 0xA9,
- BROWSER_SEARCH = 0xAA,
- BROWSER_FAVORITES = 0xAB,
- BROWSER_HOME = 0xAC,
- VOLUME_MUTE = 0xAD,
- VOLUME_DOWN = 0xAE,
- VOLUME_UP = 0xAF,
- MEDIA_NEXT_TRACK = 0xB0,
- MEDIA_PREV_TRACK = 0xB1,
- MEDIA_STOP = 0xB2,
- MEDIA_PLAY_PAUSE = 0xB3,
- LAUNCH_MAIL = 0xB4,
- LAUNCH_MEDIA_SELECT = 0xB5,
- LAUNCH_APP1 = 0xB6,
- LAUNCH_APP2 = 0xB7,
- OEM_1 = 0xBA,
- OEM_PLUS = 0xBB,
- OEM_COMMA = 0xBC,
- OEM_MINUS = 0xBD,
- OEM_PERIOD = 0xBE,
- OEM_2 = 0xBF,
- OEM_3 = 0xC0,
- OEM_4 = 0xDB,
- OEM_5 = 0xDC,
- OEM_6 = 0xDD,
- OEM_7 = 0xDE,
- OEM_8 = 0xDF,
- OEM_102 = 0xE2,
- PROCESSKEY = 0xE5,
- PACKET = 0xE7,
- ATTN = 0xF6,
- CRSEL = 0xF7,
- EXSEL = 0xF8,
- EREOF = 0xF9,
- PLAY = 0xFA,
- ZOOM = 0xFB,
- NONAME = 0xFC,
- PA1 = 0xFD,
- OEM_CLEAR = 0xFE
- }
-
- public enum ScanCodeShort : short
- {
- LBUTTON = 0,
- RBUTTON = 0,
- CANCEL = 70,
- MBUTTON = 0,
- XBUTTON1 = 0,
- XBUTTON2 = 0,
- BACK = 14,
- TAB = 15,
- CLEAR = 76,
- RETURN = 28,
- SHIFT = 42,
- CONTROL = 29,
- MENU = 56,
- PAUSE = 0,
- CAPITAL = 58,
- KANA = 0,
- HANGUL = 0,
- JUNJA = 0,
- FINAL = 0,
- HANJA = 0,
- KANJI = 0,
- ESCAPE = 1,
- CONVERT = 0,
- NONCONVERT = 0,
- ACCEPT = 0,
- MODECHANGE = 0,
- SPACE = 57,
- PRIOR = 73,
- NEXT = 81,
- END = 79,
- HOME = 71,
- LEFT = 75,
- UP = 72,
- RIGHT = 77,
- DOWN = 80,
- SELECT = 0,
- PRINT = 0,
- EXECUTE = 0,
- SNAPSHOT = 84,
- INSERT = 82,
- DELETE = 83,
- HELP = 99,
- KEY_0 = 11,
- KEY_1 = 2,
- KEY_2 = 3,
- KEY_3 = 4,
- KEY_4 = 5,
- KEY_5 = 6,
- KEY_6 = 7,
- KEY_7 = 8,
- KEY_8 = 9,
- KEY_9 = 10,
- KEY_A = 30,
- KEY_B = 48,
- KEY_C = 46,
- KEY_D = 32,
- KEY_E = 18,
- KEY_F = 33,
- KEY_G = 34,
- KEY_H = 35,
- KEY_I = 23,
- KEY_J = 36,
- KEY_K = 37,
- KEY_L = 38,
- KEY_M = 50,
- KEY_N = 49,
- KEY_O = 24,
- KEY_P = 25,
- KEY_Q = 16,
- KEY_R = 19,
- KEY_S = 31,
- KEY_T = 20,
- KEY_U = 22,
- KEY_V = 47,
- KEY_W = 17,
- KEY_X = 45,
- KEY_Y = 21,
- KEY_Z = 44,
- LWIN = 91,
- RWIN = 92,
- APPS = 93,
- SLEEP = 95,
- NUMPAD0 = 82,
- NUMPAD1 = 79,
- NUMPAD2 = 80,
- NUMPAD3 = 81,
- NUMPAD4 = 75,
- NUMPAD5 = 76,
- NUMPAD6 = 77,
- NUMPAD7 = 71,
- NUMPAD8 = 72,
- NUMPAD9 = 73,
- MULTIPLY = 55,
- ADD = 78,
- SEPARATOR = 0,
- SUBTRACT = 74,
- DECIMAL = 83,
- DIVIDE = 53,
- F1 = 59,
- F2 = 60,
- F3 = 61,
- F4 = 62,
- F5 = 63,
- F6 = 64,
- F7 = 65,
- F8 = 66,
- F9 = 67,
- F10 = 68,
- F11 = 87,
- F12 = 88,
- F13 = 100,
- F14 = 101,
- F15 = 102,
- F16 = 103,
- F17 = 104,
- F18 = 105,
- F19 = 106,
- F20 = 107,
- F21 = 108,
- F22 = 109,
- F23 = 110,
- F24 = 118,
- NUMLOCK = 69,
- SCROLL = 70,
- LSHIFT = 42,
- RSHIFT = 54,
- LCONTROL = 29,
- RCONTROL = 29,
- LMENU = 56,
- RMENU = 56,
- BROWSER_BACK = 106,
- BROWSER_FORWARD = 105,
- BROWSER_REFRESH = 103,
- BROWSER_STOP = 104,
- BROWSER_SEARCH = 101,
- BROWSER_FAVORITES = 102,
- BROWSER_HOME = 50,
- VOLUME_MUTE = 32,
- VOLUME_DOWN = 46,
- VOLUME_UP = 48,
- MEDIA_NEXT_TRACK = 25,
- MEDIA_PREV_TRACK = 16,
- MEDIA_STOP = 36,
- MEDIA_PLAY_PAUSE = 34,
- LAUNCH_MAIL = 108,
- LAUNCH_MEDIA_SELECT = 109,
- LAUNCH_APP1 = 107,
- LAUNCH_APP2 = 33,
- OEM_1 = 39,
- OEM_PLUS = 13,
- OEM_COMMA = 51,
- OEM_MINUS = 12,
- OEM_PERIOD = 52,
- OEM_2 = 53,
- OEM_3 = 41,
- OEM_4 = 26,
- OEM_5 = 43,
- OEM_6 = 27,
- OEM_7 = 40,
- OEM_8 = 0,
- OEM_102 = 86,
- PROCESSKEY = 0,
- PACKET = 0,
- ATTN = 0,
- CRSEL = 0,
- EXSEL = 0,
- EREOF = 93,
- PLAY = 0,
- ZOOM = 98,
- NONAME = 0,
- PA1 = 0,
- OEM_CLEAR = 0,
- }
-
- [StructLayout(LayoutKind.Sequential)]
- public struct HARDWAREINPUT
- {
- public int uMsg;
- public short wParamL;
- public short wParamH;
- }
-
- /// <summary>
- /// Emulate an event sent over RDP.
- /// </summary>
- /// <param name="x"></param>
- /// <param name="y"></param>
- public static void SendRDPMouseMoveEvent(int x, int y)
- {
- var mouseInput = new INPUT { type = InputType.INPUT_MOUSE };
- mouseInput.U.mi.dx = x;
- mouseInput.U.mi.dy = y;
- mouseInput.U.mi.dwFlags = MOUSEEVENTF.ABSOLUTE | MOUSEEVENTF.VIRTUALDESK | MOUSEEVENTF.MOVE;
- SendInput(1, new INPUT[] { mouseInput }, INPUT.Size);
- }
-
- /// <summary>
- /// Emulate a normal mouse move event with relative coordinates.
- /// </summary>
- /// <param name="x"></param>
- /// <param name="y"></param>
- public static void SendMouseMoveEvent(int x, int y)
- {
- var mouseInput = new INPUT { type = InputType.INPUT_MOUSE };
- mouseInput.U.mi.dx = x;
- mouseInput.U.mi.dy = y;
- mouseInput.U.mi.dwFlags = MOUSEEVENTF.MOVE;
- SendInput(1, new INPUT[] { mouseInput }, INPUT.Size);
- }
- }
-
- #endif
|