暂无描述
您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

WinUserInput.cs 11KB

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