Advertisement
Guest User

Untitled

a guest
Mar 23rd, 2017
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 35.80 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Drawing;
  5. using System.Runtime.InteropServices;
  6. using System.Threading;
  7.  
  8. namespace ICTest
  9. {
  10. // Destination object for touch/mouse/pen gestures.
  11. internal interface IInteractionHandler
  12. {
  13. void ProcessInteractionEvent(InteractionOutput output);
  14. }
  15.  
  16. // Passed as an argument to ProcessInteractionEvent.
  17. internal class InteractionOutput
  18. {
  19. internal Win32.INTERACTION_CONTEXT_OUTPUT Data;
  20.  
  21. internal IntPtr InteractionContext
  22. {
  23. get { return _interactionContext; }
  24. }
  25.  
  26. internal bool IsBegin()
  27. {
  28. return (Data.InteractionFlags & Win32.INTERACTION_FLAGS.BEGIN) != 0;
  29. }
  30.  
  31. internal bool IsInertia()
  32. {
  33. return (Data.InteractionFlags & Win32.INTERACTION_FLAGS.INERTIA) != 0;
  34. }
  35.  
  36. internal bool IsEnd()
  37. {
  38. return (Data.InteractionFlags & Win32.INTERACTION_FLAGS.END) != 0;
  39. }
  40.  
  41. #region ** infrastructure
  42.  
  43. IntPtr _interactionContext;
  44. IInteractionHandler _interactionHandler;
  45. SynchronizationContext _syncContext;
  46.  
  47. internal InteractionOutput(IntPtr interactionContext, IInteractionHandler interactionHandler, SynchronizationContext syncContext)
  48. {
  49. _interactionContext = interactionContext;
  50. _interactionHandler = interactionHandler;
  51. _syncContext = syncContext;
  52. Alive = true;
  53. }
  54.  
  55. internal bool Alive { get; set; }
  56.  
  57. internal IInteractionHandler InteractionHandler
  58. {
  59. get { return _interactionHandler; }
  60. }
  61.  
  62. internal SynchronizationContext SyncContext
  63. {
  64. get { return _syncContext; }
  65. }
  66.  
  67. #endregion
  68. }
  69.  
  70. [System.Security.SuppressUnmanagedCodeSecurity()]
  71. internal static class Win32
  72. {
  73. //------------------------------------------------------------------
  74. #region ** fields and utility methods
  75.  
  76. internal static readonly int CursorInfoSize;
  77.  
  78. #region ** infrastructure
  79.  
  80. static Timer _timer;
  81. static Queue<InteractionOutput> _inertiaQueue;
  82. static Dictionary<long, InteractionOutput> _listeners;
  83. static INTERACTION_CONTEXT_OUTPUT_CALLBACK _callback;
  84. static object _lockObj = new object();
  85.  
  86. static Win32()
  87. {
  88. CursorInfoSize = Marshal.SizeOf(new CURSORINFO());
  89. _inertiaQueue = new Queue<InteractionOutput>();
  90. _listeners = new Dictionary<long, InteractionOutput>();
  91. _timer = new Timer(TimerElapsed, null, 100, 15);
  92. _callback = CallbackFunction;
  93. }
  94.  
  95. static void TimerElapsed(object state)
  96. {
  97. InteractionOutput[] items = null;
  98. lock (_lockObj)
  99. {
  100. if (_inertiaQueue.Count > 0)
  101. {
  102. items = _inertiaQueue.ToArray();
  103. _inertiaQueue.Clear();
  104. }
  105. }
  106. if (items != null)
  107. {
  108. for (int i = 0; i < items.Length; i++)
  109. {
  110. InteractionOutput io = items[i];
  111. for (int j = 0; j < i; j++)
  112. {
  113. if (items[j].InteractionContext == io.InteractionContext)
  114. {
  115. io = null;
  116. break;
  117. }
  118. }
  119. if (io != null && io.Alive)
  120. {
  121. io.SyncContext.Post(delegate(object obj)
  122. {
  123. InteractionOutput m = (InteractionOutput)obj;
  124. if (m.Alive)
  125. {
  126. ProcessInertiaInteractionContext(m.InteractionContext);
  127. }
  128. }, io);
  129. }
  130. }
  131. }
  132. }
  133.  
  134. static void CallbackFunction(IntPtr ic, IntPtr outputPtr)
  135. {
  136. InteractionOutput io;
  137. lock (_lockObj)
  138. {
  139. _listeners.TryGetValue(ic.ToInt64(), out io);
  140. }
  141. if (io != null)
  142. {
  143. io.Data = (INTERACTION_CONTEXT_OUTPUT)Marshal.PtrToStructure(outputPtr, typeof(INTERACTION_CONTEXT_OUTPUT));
  144.  
  145. io.InteractionHandler.ProcessInteractionEvent(io);
  146.  
  147. if (io.Alive && (io.Data.InteractionFlags & INTERACTION_FLAGS.INERTIA) != 0 &&
  148. (io.Data.InteractionFlags & (INTERACTION_FLAGS.END | INTERACTION_FLAGS.CANCEL)) == 0)
  149. {
  150. lock (_lockObj)
  151. {
  152. _inertiaQueue.Enqueue(io);
  153. }
  154. }
  155. }
  156. }
  157.  
  158. #endregion
  159.  
  160. internal static IntPtr CreateInteractionContext(IInteractionHandler interactionHandler, SynchronizationContext syncContext)
  161. {
  162. IntPtr ic;
  163. CreateInteractionContext(out ic);
  164. InteractionOutput io = new InteractionOutput(ic, interactionHandler, syncContext);
  165. lock (_lockObj)
  166. {
  167. _listeners.Add(ic.ToInt64(), io);
  168. }
  169. RegisterOutputCallbackInteractionContext(ic, Marshal.GetFunctionPointerForDelegate(_callback), ic);
  170. return ic;
  171. }
  172.  
  173. internal static void DisposeInteractionContext(IntPtr interactionContext)
  174. {
  175. if (interactionContext != IntPtr.Zero)
  176. {
  177. InteractionOutput io;
  178. lock (_lockObj)
  179. {
  180. if (_listeners.TryGetValue(interactionContext.ToInt64(), out io))
  181. {
  182. io.Alive = false;
  183. _listeners.Remove(interactionContext.ToInt64());
  184. }
  185. }
  186. DestroyInteractionContext(interactionContext);
  187. }
  188. }
  189.  
  190. internal static int GET_POINTER_ID(IntPtr wParam)
  191. {
  192. return LOWORD(wParam);
  193. }
  194.  
  195. internal static bool IS_POINTER_FLAG_SET(IntPtr wParam, POINTER_MESSAGE_FLAG flag)
  196. {
  197. return (HIWORD(wParam) & (int)flag) != 0;
  198. }
  199.  
  200. internal static int HIWORD(IntPtr wParam)
  201. {
  202. return (int)((wParam.ToInt64() >> 16) & 0xffff);
  203. }
  204.  
  205. internal static int LOWORD(IntPtr wParam)
  206. {
  207. return (int)(wParam.ToInt64() & 0xffff);
  208. }
  209.  
  210. internal static int GET_WHEEL_DELTA(IntPtr wParam)
  211. {
  212. return GET_Y(wParam);
  213. }
  214.  
  215. internal static int GET_X(IntPtr lParam)
  216. {
  217. return (int)((short)(lParam.ToInt64() & 0xffff));
  218. }
  219.  
  220. internal static int GET_Y(IntPtr lParam)
  221. {
  222. return (int)((short)((lParam.ToInt64() >> 16) & 0xffff));
  223. }
  224.  
  225. internal static bool SUCCEEDED(IntPtr hr)
  226. {
  227. return unchecked((int)hr.ToInt64()) >= 0;
  228. }
  229.  
  230. internal static bool FAILED(IntPtr hr)
  231. {
  232. return unchecked((int)hr.ToInt64()) < 0;
  233. }
  234.  
  235. internal static string GetMessageForHR(IntPtr hr)
  236. {
  237. Exception ex = Marshal.GetExceptionForHR(unchecked((int)hr.ToInt64()));
  238. return ex != null ? ex.Message : string.Empty;
  239. }
  240.  
  241. internal static bool IsCursorSuppressed()
  242. {
  243. CURSORINFO ci = new CURSORINFO();
  244. ci.Size = CursorInfoSize;
  245. if (GetCursorInfo(ref ci))
  246. {
  247. if (ci.Flags == CURSOR_STATE.SUPPRESSED)
  248. {
  249. return true;
  250. }
  251. }
  252. return false;
  253. }
  254.  
  255. internal static void CheckLastError()
  256. {
  257. int errCode = Marshal.GetLastWin32Error();
  258. if (errCode != 0)
  259. {
  260. throw new Win32Exception(errCode);
  261. }
  262. }
  263.  
  264. #endregion
  265.  
  266. //------------------------------------------------------------------
  267. #region ** misc constants
  268.  
  269. internal const int
  270. GWFS_INCLUDE_ANCESTORS = 0x00000001;
  271.  
  272. internal enum FEEDBACK_TYPE
  273. {
  274. TOUCH_CONTACTVISUALIZATION = 1,
  275. PEN_BARRELVISUALIZATION = 2,
  276. PEN_TAP = 3,
  277. PEN_DOUBLETAP = 4,
  278. PEN_PRESSANDHOLD = 5,
  279. PEN_RIGHTTAP = 6,
  280. TOUCH_TAP = 7,
  281. TOUCH_DOUBLETAP = 8,
  282. TOUCH_PRESSANDHOLD = 9,
  283. TOUCH_RIGHTTAP = 10,
  284. GESTURE_PRESSANDTAP = 11
  285. }
  286.  
  287. internal const int
  288. SPI_GETCONTACTVISUALIZATION = 0x2018,
  289. SPI_SETCONTACTVISUALIZATION = 0x2019,
  290. SPI_GETGESTUREVISUALIZATION = 0x201A,
  291. SPI_SETGESTUREVISUALIZATION = 0x201B;
  292.  
  293. [Flags]
  294. internal enum CONTACTVISUALIZATION
  295. {
  296. OFF = 0x0000,
  297. ON = 0x0001,
  298. PRESENTATIONMODE = 0x0002,
  299. }
  300.  
  301. [Flags]
  302. internal enum GESTUREVISUALIZATION
  303. {
  304. OFF = 0x0000,
  305. ON = 0x001F,
  306. TAP = 0x0001,
  307. DOUBLETAP = 0x0002,
  308. PRESSANDTAP = 0x0004,
  309. PRESSANDHOLD = 0x0008,
  310. RIGHTTAP = 0x0010,
  311. }
  312.  
  313. internal enum CURSOR_STATE
  314. {
  315. HIDDEN,
  316. SHOWING,
  317. SUPPRESSED
  318. }
  319.  
  320. #endregion
  321.  
  322. //------------------------------------------------------------------
  323. #region ** pointer constants
  324.  
  325. internal const int
  326.  
  327. WM_PARENTNOTIFY = 0x0210,
  328. WM_NCPOINTERUPDATE = 0x0241,
  329. WM_NCPOINTERDOWN = 0x0242,
  330. WM_NCPOINTERUP = 0x0243,
  331. WM_POINTERUPDATE = 0x0245,
  332. WM_POINTERDOWN = 0x0246,
  333. WM_POINTERUP = 0x0247,
  334. WM_POINTERENTER = 0x0249,
  335. WM_POINTERLEAVE = 0x024A,
  336. WM_POINTERACTIVATE = 0x024B,
  337. WM_POINTERCAPTURECHANGED = 0x024C,
  338. WM_POINTERWHEEL = 0x024E,
  339. WM_POINTERHWHEEL = 0x024F,
  340.  
  341. // WM_POINTERACTIVATE return codes
  342. PA_ACTIVATE = 1,
  343. PA_NOACTIVATE = 3,
  344.  
  345. MAX_TOUCH_COUNT = 256;
  346.  
  347. internal enum POINTER_INPUT_TYPE
  348. {
  349. POINTER = 0x00000001,
  350. TOUCH = 0x00000002,
  351. PEN = 0x00000003,
  352. MOUSE = 0x00000004
  353. }
  354.  
  355. [Flags]
  356. internal enum POINTER_FLAGS
  357. {
  358. NONE = 0x00000000,
  359. NEW = 0x00000001,
  360. INRANGE = 0x00000002,
  361. INCONTACT = 0x00000004,
  362. FIRSTBUTTON = 0x00000010,
  363. SECONDBUTTON = 0x00000020,
  364. THIRDBUTTON = 0x00000040,
  365. FOURTHBUTTON = 0x00000080,
  366. FIFTHBUTTON = 0x00000100,
  367. PRIMARY = 0x00002000,
  368. CONFIDENCE = 0x00004000,
  369. CANCELED = 0x00008000,
  370. DOWN = 0x00010000,
  371. UPDATE = 0x00020000,
  372. UP = 0x00040000,
  373. WHEEL = 0x00080000,
  374. HWHEEL = 0x00100000,
  375. CAPTURECHANGED = 0x00200000,
  376. }
  377.  
  378. [Flags]
  379. internal enum VIRTUAL_KEY_STATES
  380. {
  381. NONE = 0x0000,
  382. LBUTTON = 0x0001,
  383. RBUTTON = 0x0002,
  384. SHIFT = 0x0004,
  385. CTRL = 0x0008,
  386. MBUTTON = 0x0010,
  387. XBUTTON1 = 0x0020,
  388. XBUTTON2 = 0x0040
  389. }
  390.  
  391. internal enum POINTER_CHANGE
  392. {
  393. NONE,
  394. FIRSTBUTTON_DOWN,
  395. FIRSTBUTTON_UP,
  396. SECONDBUTTON_DOWN,
  397. SECONDBUTTON_UP,
  398. THIRDBUTTON_DOWN,
  399. THIRDBUTTON_UP,
  400. FOURTHBUTTON_DOWN,
  401. FOURTHBUTTON_UP,
  402. FIFTHBUTTON_DOWN,
  403. FIFTHBUTTON_UP
  404. }
  405.  
  406. [Flags]
  407. internal enum TOUCH_FLAGS
  408. {
  409. NONE = 0x00000000
  410. }
  411.  
  412. [Flags]
  413. internal enum TOUCH_MASK
  414. {
  415. NONE = 0x00000000,
  416. CONTACTAREA = 0x00000001,
  417. ORIENTATION = 0x00000002,
  418. PRESSURE = 0x00000004,
  419. }
  420.  
  421. [Flags]
  422. internal enum PEN_FLAGS
  423. {
  424. NONE = 0x00000000,
  425. BARREL = 0x00000001,
  426. INVERTED = 0x00000002,
  427. ERASER = 0x00000004,
  428. }
  429.  
  430. [Flags]
  431. internal enum PEN_MASK
  432. {
  433. NONE = 0x00000000,
  434. PRESSURE = 0x00000001,
  435. ROTATION = 0x00000002,
  436. TILT_X = 0x00000004,
  437. TILT_Y = 0x00000008,
  438. }
  439.  
  440. [Flags]
  441. internal enum POINTER_MESSAGE_FLAG
  442. {
  443. NEW = 0x00000001,
  444. INRANGE = 0x00000002,
  445. INCONTACT = 0x00000004,
  446. FIRSTBUTTON = 0x00000010,
  447. SECONDBUTTON = 0x00000020,
  448. THIRDBUTTON = 0x00000040,
  449. FOURTHBUTTON = 0x00000080,
  450. FIFTHBUTTON = 0x00000100,
  451. PRIMARY = 0x00002000,
  452. CONFIDENCE = 0x00004000,
  453. CANCELED = 0x00008000,
  454. }
  455.  
  456. internal enum TOUCH_FEEDBACK
  457. {
  458. DEFAULT = 0x1,
  459. INDIRECT = 0x2,
  460. NONE = 0x3
  461. }
  462.  
  463. #endregion
  464.  
  465. //------------------------------------------------------------------
  466. #region ** interaction context constants
  467.  
  468. internal enum INTERACTION
  469. {
  470. NONE = 0x00000000,
  471. MANIPULATION = 0x00000001,
  472. TAP = 0x00000002,
  473. SECONDARY_TAP = 0x00000003,
  474. HOLD = 0x00000004,
  475. DRAG = 0x00000005,
  476. CROSS_SLIDE = 0x00000006
  477. }
  478.  
  479. [Flags]
  480. internal enum INTERACTION_FLAGS
  481. {
  482. NONE = 0x00000000,
  483. BEGIN = 0x00000001,
  484. END = 0x00000002,
  485. CANCEL = 0x00000004,
  486. INERTIA = 0x00000008
  487. }
  488.  
  489. [Flags]
  490. internal enum INTERACTION_CONFIGURATION_FLAGS
  491. {
  492. NONE = 0x00000000,
  493. MANIPULATION = 0x00000001,
  494. MANIPULATION_TRANSLATION_X = 0x00000002,
  495. MANIPULATION_TRANSLATION_Y = 0x00000004,
  496. MANIPULATION_ROTATION = 0x00000008,
  497. MANIPULATION_SCALING = 0x00000010,
  498. MANIPULATION_TRANSLATION_INERTIA = 0x00000020,
  499. MANIPULATION_ROTATION_INERTIA = 0x00000040,
  500. MANIPULATION_SCALING_INERTIA = 0x00000080,
  501. MANIPULATION_RAILS_X = 0x00000100,
  502. MANIPULATION_RAILS_Y = 0x00000200,
  503. MANIPULATION_EXACT = 0x00000400,
  504. CROSS_SLIDE = 0x00000001,
  505. CROSS_SLIDE_HORIZONTAL = 0x00000002,
  506. CROSS_SLIDE_SELECT = 0x00000004,
  507. CROSS_SLIDE_SPEED_BUMP = 0x00000008,
  508. CROSS_SLIDE_REARRANGE = 0x00000010,
  509. CROSS_SLIDE_EXACT = 0x00000020,
  510. TAP = 0x00000001,
  511. TAP_DOUBLE = 0x00000002,
  512. SECONDARY_TAP = 0x00000001,
  513. HOLD = 0x00000001,
  514. HOLD_MOUSE = 0x00000002,
  515. DRAG = 0x00000001
  516. }
  517.  
  518. internal enum INERTIA_PARAMETER
  519. {
  520. TRANSLATION_DECELERATION = 0x00000001,
  521. TRANSLATION_DISPLACEMENT = 0x00000002,
  522. ROTATION_DECELERATION = 0x00000003,
  523. ROTATION_ANGLE = 0x00000004,
  524. EXPANSION_DECELERATION = 0x00000005,
  525. EXPANSION_EXPANSION = 0x00000006
  526. }
  527.  
  528. internal enum INTERACTION_STATE
  529. {
  530. IDLE = 0x00000000,
  531. IN_INTERACTION = 0x00000001,
  532. POSSIBLE_DOUBLE_TAP = 0x00000002
  533. }
  534.  
  535. internal enum INTERACTION_CONTEXT_PROPERTY
  536. {
  537. MEASUREMENT_UNITS = 0x00000001,
  538. INTERACTION_UI_FEEDBACK = 0x00000002,
  539. FILTER_POINTERS = 0x00000003
  540. }
  541.  
  542. internal const int
  543. ICP_MEASUREMENT_UNITS_HIMETRIC = 0,
  544. ICP_MEASUREMENT_UNITS_SCREEN = 1,
  545. ICP_UI_FEEDBACK_OFF = 0,
  546. ICP_UI_FEEDBACK_ON = 1,
  547. ICP_FILTER_POINTERS_OFF = 0,
  548. ICP_FILTER_POINTERS_ON = 1;
  549.  
  550. internal enum CROSS_SLIDE_THRESHOLD
  551. {
  552. SELECT_START = 0x00000000,
  553. SPEED_BUMP_START = 0x00000001,
  554. SPEED_BUMP_END = 0x00000002,
  555. REARRANGE_START = 0x00000003,
  556. COUNT = 0x00000004
  557. }
  558.  
  559. [Flags]
  560. internal enum CROSS_SLIDE_FLAGS
  561. {
  562. NONE = 0x00000000,
  563. SELECT = 0x00000001,
  564. SPEED_BUMP = 0x00000002,
  565. REARRANGE = 0x00000004
  566. }
  567.  
  568. internal enum MOUSE_WHEEL_PARAMETER
  569. {
  570. CHAR_TRANSLATION_X = 0x00000001,
  571. CHAR_TRANSLATION_Y = 0x00000002,
  572. DELTA_SCALE = 0x00000003,
  573. DELTA_ROTATION = 0x00000004,
  574. PAGE_TRANSLATION_X = 0x00000005,
  575. PAGE_TRANSLATION_Y = 0x00000006
  576. }
  577.  
  578. internal enum MANIPULATION_RAILS_STATE
  579. {
  580. UNDECIDED = 0x00000000,
  581. FREE = 0x00000001,
  582. RAILED = 0x00000002,
  583. }
  584.  
  585. #endregion
  586.  
  587. //------------------------------------------------------------------
  588. #region ** misc structs
  589.  
  590. #region CURSORINFO
  591.  
  592. [StructLayout(LayoutKind.Sequential)]
  593. internal struct CURSORINFO
  594. {
  595. public int Size;
  596. public CURSOR_STATE Flags;
  597. public IntPtr Cursor;
  598. [MarshalAs(UnmanagedType.Struct)]
  599. public POINT ScreenPos;
  600. }
  601.  
  602. #endregion
  603.  
  604. #region POINT
  605.  
  606. [StructLayout(LayoutKind.Sequential)]
  607. internal struct POINT
  608. {
  609. public int X;
  610. public int Y;
  611.  
  612. public POINT(int x, int y)
  613. {
  614. X = x;
  615. Y = y;
  616. }
  617. public POINT(Point pt)
  618. {
  619. X = pt.X;
  620. Y = pt.Y;
  621. }
  622. public Point ToPoint()
  623. {
  624. return new Point(X, Y);
  625. }
  626. public void AssignTo(ref Point destination)
  627. {
  628. destination.X = X;
  629. destination.Y = Y;
  630. }
  631. public void CopyFrom(Point source)
  632. {
  633. X = source.X;
  634. Y = source.Y;
  635. }
  636. public void CopyFrom(POINT source)
  637. {
  638. X = source.X;
  639. Y = source.Y;
  640. }
  641. }
  642.  
  643. #endregion
  644.  
  645. #region RECT
  646.  
  647. [StructLayout(LayoutKind.Sequential)]
  648. internal struct RECT
  649. {
  650. public int Left;
  651. public int Top;
  652. public int Right;
  653. public int Bottom;
  654.  
  655. public RECT(Rectangle source)
  656. {
  657. Left = source.Left;
  658. Top = source.Top;
  659. Right = source.Right;
  660. Bottom = source.Bottom;
  661. }
  662. public RECT(int x, int y, int width, int height)
  663. {
  664. Left = x;
  665. Top = y;
  666. Right = Left + width;
  667. Bottom = Top + height;
  668. }
  669. public int Width
  670. {
  671. get { return Right - Left; }
  672. }
  673. public int Height
  674. {
  675. get { return Bottom - Top; }
  676. }
  677. public Rectangle ToRectangle()
  678. {
  679. return new Rectangle(Left, Top, Width, Height);
  680. }
  681. public void Inflate(int dx, int dy)
  682. {
  683. Left -= dx;
  684. Top -= dy;
  685. Right += dx;
  686. Bottom += dy;
  687. }
  688. public void Deflate(int leftMargin, int topMargin, int rightMargin, int bottomMargin)
  689. {
  690. Left += leftMargin;
  691. Top += topMargin;
  692. Right -= rightMargin;
  693. Bottom -= bottomMargin;
  694. if (Bottom < Top)
  695. {
  696. Bottom = Top;
  697. }
  698. if (Right < Left)
  699. {
  700. Right = Left;
  701. }
  702. }
  703. public void Offset(int dx, int dy)
  704. {
  705. Left += dx;
  706. Top += dy;
  707. Right += dx;
  708. Bottom += dy;
  709. }
  710. }
  711.  
  712. #endregion
  713.  
  714. #endregion
  715.  
  716. //------------------------------------------------------------------
  717. #region ** pointer structs
  718.  
  719. #region POINTER_INFO
  720.  
  721. [StructLayout(LayoutKind.Sequential)]
  722. internal struct POINTER_INFO
  723. {
  724. public POINTER_INPUT_TYPE pointerType;
  725. public int PointerID;
  726. public int FrameID;
  727. public POINTER_FLAGS PointerFlags;
  728. public IntPtr SourceDevice;
  729. public IntPtr WindowTarget;
  730. [MarshalAs(UnmanagedType.Struct)]
  731. public POINT PtPixelLocation;
  732. [MarshalAs(UnmanagedType.Struct)]
  733. public POINT PtPixelLocationRaw;
  734. [MarshalAs(UnmanagedType.Struct)]
  735. public POINT PtHimetricLocation;
  736. [MarshalAs(UnmanagedType.Struct)]
  737. public POINT PtHimetricLocationRaw;
  738. public uint Time;
  739. public uint HistoryCount;
  740. public uint InputData;
  741. public VIRTUAL_KEY_STATES KeyStates;
  742. public long PerformanceCount;
  743. public int ButtonChangeType;
  744. }
  745.  
  746. #endregion
  747.  
  748. #region POINTER_TOUCH_INFO
  749.  
  750. [StructLayout(LayoutKind.Sequential)]
  751. internal struct POINTER_TOUCH_INFO
  752. {
  753. [MarshalAs(UnmanagedType.Struct)]
  754. public POINTER_INFO PointerInfo;
  755. public TOUCH_FLAGS TouchFlags;
  756. public TOUCH_MASK TouchMask;
  757. [MarshalAs(UnmanagedType.Struct)]
  758. public RECT ContactArea;
  759. [MarshalAs(UnmanagedType.Struct)]
  760. public RECT ContactAreaRaw;
  761. public uint Orientation;
  762. public uint Pressure;
  763. }
  764.  
  765. #endregion
  766.  
  767. #region POINTER_PEN_INFO
  768.  
  769. [StructLayout(LayoutKind.Sequential)]
  770. internal struct POINTER_PEN_INFO
  771. {
  772. [MarshalAs(UnmanagedType.Struct)]
  773. public POINTER_INFO PointerInfo;
  774. public PEN_FLAGS PenFlags;
  775. public PEN_MASK PenMask;
  776. public uint Pressure;
  777. public uint Rotation;
  778. public int TiltX;
  779. public int TiltY;
  780. }
  781.  
  782. #endregion
  783.  
  784. #endregion
  785.  
  786. //------------------------------------------------------------------
  787. #region ** interaction context structs
  788.  
  789. #region MANIPULATION_TRANSFORM
  790.  
  791. [StructLayout(LayoutKind.Sequential)]
  792. internal struct MANIPULATION_TRANSFORM
  793. {
  794. public float TranslationX;
  795. public float TranslationY;
  796. public float Scale;
  797. public float Expansion;
  798. public float Rotation;
  799. }
  800.  
  801. #endregion
  802.  
  803. #region MANIPULATION_VELOCITY
  804.  
  805. [StructLayout(LayoutKind.Sequential)]
  806. internal struct MANIPULATION_VELOCITY
  807. {
  808. public float VelocityX;
  809. public float VelocityY;
  810. public float VelocityExpansion;
  811. public float VelocityAngular;
  812. }
  813.  
  814. #endregion
  815.  
  816. #region INTERACTION_ARGUMENTS_MANIPULATION
  817.  
  818. [StructLayout(LayoutKind.Sequential)]
  819. internal struct INTERACTION_ARGUMENTS_MANIPULATION
  820. {
  821. [MarshalAs(UnmanagedType.Struct)]
  822. public MANIPULATION_TRANSFORM Delta;
  823. [MarshalAs(UnmanagedType.Struct)]
  824. public MANIPULATION_TRANSFORM Cumulative;
  825. [MarshalAs(UnmanagedType.Struct)]
  826. public MANIPULATION_VELOCITY Velocity;
  827. public MANIPULATION_RAILS_STATE RailsState;
  828. }
  829.  
  830. #endregion
  831.  
  832. #region INTERACTION_ARGUMENTS_TAP
  833.  
  834. [StructLayout(LayoutKind.Sequential)]
  835. internal struct INTERACTION_ARGUMENTS_TAP
  836. {
  837. public int Count;
  838. }
  839.  
  840. #endregion
  841.  
  842. #region INTERACTION_ARGUMENTS_CROSS_SLIDE
  843.  
  844. [StructLayout(LayoutKind.Sequential)]
  845. internal struct INTERACTION_ARGUMENTS_CROSS_SLIDE
  846. {
  847. public CROSS_SLIDE_FLAGS Flags;
  848. }
  849.  
  850. #endregion
  851.  
  852. #region INTERACTION_CONTEXT_OUTPUT
  853.  
  854. [StructLayout(LayoutKind.Explicit)]
  855. internal struct INTERACTION_CONTEXT_OUTPUT
  856. {
  857. [FieldOffset(0)]
  858. public INTERACTION Interaction;
  859. [FieldOffset(4)]
  860. public INTERACTION_FLAGS InteractionFlags;
  861. [FieldOffset(8)]
  862. public POINTER_INPUT_TYPE InputType;
  863. [FieldOffset(12)]
  864. public float X;
  865. [FieldOffset(16)]
  866. public float Y;
  867. [FieldOffset(20)]
  868. [MarshalAs(UnmanagedType.Struct)]
  869. public INTERACTION_ARGUMENTS_MANIPULATION Manipulation;
  870. [FieldOffset(20)]
  871. [MarshalAs(UnmanagedType.Struct)]
  872. public INTERACTION_ARGUMENTS_TAP Tap;
  873. [FieldOffset(20)]
  874. [MarshalAs(UnmanagedType.Struct)]
  875. public INTERACTION_ARGUMENTS_CROSS_SLIDE CrossSlide;
  876. }
  877.  
  878. #endregion
  879.  
  880. #region INTERACTION_CONTEXT_CONFIGURATION
  881.  
  882. [StructLayout(LayoutKind.Sequential)]
  883. internal struct INTERACTION_CONTEXT_CONFIGURATION
  884. {
  885. public INTERACTION Interaction;
  886. public INTERACTION_CONFIGURATION_FLAGS Enable;
  887.  
  888. public INTERACTION_CONTEXT_CONFIGURATION(INTERACTION interaction, INTERACTION_CONFIGURATION_FLAGS enable)
  889. {
  890. Interaction = interaction;
  891. Enable = enable;
  892. }
  893. }
  894.  
  895. #endregion
  896.  
  897. #region CROSS_SLIDE_PARAMETER
  898.  
  899. [StructLayout(LayoutKind.Sequential)]
  900. internal struct CROSS_SLIDE_PARAMETER
  901. {
  902. public CROSS_SLIDE_THRESHOLD Threshold;
  903. public float Distance;
  904. }
  905.  
  906. #endregion
  907.  
  908. #endregion
  909.  
  910. //------------------------------------------------------------------
  911. #region ** misc methods
  912.  
  913. [DllImport("gdi32.dll", ExactSpelling = true, EntryPoint = "CreateICW", CharSet = CharSet.Unicode)]
  914. internal static extern IntPtr CreateIC(string lpszDriverName, IntPtr lpszDeviceName, IntPtr lpszOutput, IntPtr lpInitData);
  915.  
  916. [DllImport("gdi32.dll", ExactSpelling = true)]
  917. internal static extern bool DeleteDC(IntPtr hDC);
  918.  
  919. [DllImport("gdi32.dll", ExactSpelling = true)]
  920. internal static extern int GetDeviceCaps(IntPtr hDC, int index);
  921.  
  922. [DllImport("user32.dll", SetLastError = true, ExactSpelling = true, EntryPoint = "SystemParametersInfoW", CharSet = CharSet.Unicode)]
  923. internal static extern bool SystemParametersInfo(int uiAction, int uiParam, IntPtr pvParam, int fWinIni);
  924.  
  925. [DllImport("user32.dll", SetLastError = true)]
  926. internal static extern bool GetWindowFeedbackSetting(IntPtr hWnd, FEEDBACK_TYPE feedback, int dwFlags, ref int pSize, out int config);
  927.  
  928. [DllImport("user32.dll", SetLastError = true)]
  929. internal static extern bool SetWindowFeedbackSetting(IntPtr hWnd, FEEDBACK_TYPE feedback, int dwFlags, int size, ref int config);
  930.  
  931. [DllImport("user32.dll", SetLastError = true)]
  932. internal static extern bool SetWindowFeedbackSetting(IntPtr hWnd, FEEDBACK_TYPE feedback, int dwFlags, int size, IntPtr config);
  933.  
  934. [DllImport("user32.dll", SetLastError = true)]
  935. internal static extern bool GetCursorInfo(ref CURSORINFO ci);
  936.  
  937. [DllImport("uxtheme.dll")]
  938. internal static extern bool BeginPanningFeedback(IntPtr hWnd);
  939.  
  940. [DllImport("uxtheme.dll")]
  941. internal static extern bool UpdatePanningFeedback(IntPtr hWnd, int lTotalOverpanOffsetX, int lTotalOverpanOffsetY, bool fInInertia);
  942.  
  943. [DllImport("uxtheme.dll")]
  944. internal static extern bool EndPanningFeedback(IntPtr hWnd, bool fAnimateBack);
  945.  
  946. #endregion
  947.  
  948. //------------------------------------------------------------------
  949. #region ** pointer methods
  950.  
  951. [DllImport("user32.dll", SetLastError = true)]
  952. internal static extern bool InitializeTouchInjection(int maxCount, TOUCH_FEEDBACK feedbackMode);
  953.  
  954. [DllImport("user32.dll", SetLastError = true)]
  955. internal static extern bool InjectTouchInput(int count, [MarshalAs(UnmanagedType.LPArray), In] POINTER_TOUCH_INFO[] contacts);
  956.  
  957. [DllImport("user32.dll", SetLastError = true)]
  958. internal static extern bool GetPointerType(int pointerID, out POINTER_INPUT_TYPE pointerType);
  959.  
  960. [DllImport("user32.dll", SetLastError = true)]
  961. internal static extern bool GetPointerInfo(int pointerID, ref POINTER_INFO pointerInfo);
  962.  
  963. [DllImport("user32.dll", SetLastError = true)]
  964. internal static extern bool GetPointerInfoHistory(int pointerID, ref int entriesCount, [MarshalAs(UnmanagedType.LPArray), In, Out] POINTER_INFO[] pointerInfo);
  965.  
  966. [DllImport("user32.dll", SetLastError = true)]
  967. internal static extern bool GetPointerInfoHistory(int pointerID, ref int entriesCount, IntPtr pointerInfo);
  968.  
  969. [DllImport("user32.dll", SetLastError = true)]
  970. internal static extern bool GetPointerFrameInfo(int pointerID, ref int pointerCount, [MarshalAs(UnmanagedType.LPArray), In, Out] POINTER_INFO[] pointerInfo);
  971.  
  972. [DllImport("user32.dll", SetLastError = true)]
  973. internal static extern bool GetPointerFrameInfo(int pointerID, ref int pointerCount, IntPtr pointerInfo);
  974.  
  975. [DllImport("user32.dll", SetLastError = true)]
  976. internal static extern bool GetPointerFrameInfoHistory(int pointerID, ref int entriesCount, ref int pointerCount,
  977. [MarshalAs(UnmanagedType.LPArray), In, Out] POINTER_INFO[] pointerInfo);
  978.  
  979. [DllImport("user32.dll", SetLastError = true)]
  980. internal static extern bool GetPointerFrameInfoHistory(int pointerID, ref int entriesCount, ref int pointerCount, IntPtr pointerInfo);
  981.  
  982. [DllImport("user32.dll", SetLastError = true)]
  983. internal static extern bool GetPointerTouchInfo(int pointerID, ref POINTER_TOUCH_INFO touchInfo);
  984.  
  985. [DllImport("user32.dll", SetLastError = true)]
  986. internal static extern bool GetPointerFrameTouchInfo(int pointerID, ref int pointerCount, [MarshalAs(UnmanagedType.LPArray), In, Out] POINTER_TOUCH_INFO[] touchInfo);
  987.  
  988. [DllImport("user32.dll", SetLastError = true)]
  989. internal static extern bool GetPointerFrameTouchInfo(int pointerID, ref int pointerCount, IntPtr touchInfo);
  990.  
  991. [DllImport("user32.dll", SetLastError = true)]
  992. internal static extern bool GetPointerPenInfo(int pointerID, ref POINTER_PEN_INFO penInfo);
  993.  
  994. [DllImport("user32.dll", SetLastError = true)]
  995. internal static extern bool GetPointerFramePenInfo(int pointerID, ref int pointerCount, [MarshalAs(UnmanagedType.LPArray), In, Out] POINTER_PEN_INFO[] penInfo);
  996.  
  997. [DllImport("user32.dll", SetLastError = true)]
  998. internal static extern bool GetPointerFramePenInfo(int pointerID, ref int pointerCount, IntPtr penInfo);
  999.  
  1000. [DllImport("user32.dll", SetLastError = true)]
  1001. internal static extern bool SkipPointerFrameMessages(int pointerID);
  1002.  
  1003. [DllImport("user32.dll", SetLastError = true)]
  1004. internal static extern bool EnableMouseInPointer([MarshalAs(UnmanagedType.Bool), In] bool enable);
  1005.  
  1006. [DllImport("user32.dll")]
  1007. internal static extern bool IsMouseInPointerEnabled();
  1008.  
  1009. #endregion
  1010.  
  1011. //------------------------------------------------------------------
  1012. #region ** interaction context methods
  1013.  
  1014. [DllImport("ninput.dll", PreserveSig = false)]
  1015. static extern void CreateInteractionContext(out IntPtr interactionContext);
  1016.  
  1017. [DllImport("ninput.dll", PreserveSig = false)]
  1018. static extern void DestroyInteractionContext(IntPtr interactionContext);
  1019.  
  1020. [UnmanagedFunctionPointer(CallingConvention.StdCall)]
  1021. delegate void INTERACTION_CONTEXT_OUTPUT_CALLBACK(IntPtr clientData, IntPtr output);
  1022.  
  1023. [DllImport("ninput.dll", PreserveSig = false)]
  1024. static extern void RegisterOutputCallbackInteractionContext(IntPtr interactionContext, IntPtr callbackFunc, IntPtr clientData);
  1025.  
  1026. [DllImport("ninput.dll", PreserveSig = false)]
  1027. internal static extern void SetInteractionConfigurationInteractionContext(IntPtr interactionContext,
  1028. int configurationCount, [MarshalAs(UnmanagedType.LPArray), In] INTERACTION_CONTEXT_CONFIGURATION[] configuration);
  1029.  
  1030. [DllImport("ninput.dll", PreserveSig = false)]
  1031. internal static extern void GetInteractionConfigurationInteractionContext(IntPtr interactionContext,
  1032. int configurationCount, [MarshalAs(UnmanagedType.LPArray), In, Out] INTERACTION_CONTEXT_CONFIGURATION[] configuration);
  1033.  
  1034. [DllImport("ninput.dll", PreserveSig = false)]
  1035. internal static extern void SetPropertyInteractionContext(IntPtr interactionContext,
  1036. INTERACTION_CONTEXT_PROPERTY contextProperty, int value);
  1037.  
  1038. [DllImport("ninput.dll", PreserveSig = false)]
  1039. internal static extern void GetPropertyInteractionContext(IntPtr interactionContext,
  1040. INTERACTION_CONTEXT_PROPERTY contextProperty, out int value);
  1041.  
  1042. [DllImport("ninput.dll", PreserveSig = false)]
  1043. internal static extern void SetInertiaParameterInteractionContext(IntPtr interactionContext,
  1044. INERTIA_PARAMETER inertiaParameter, float value);
  1045.  
  1046. [DllImport("ninput.dll", PreserveSig = false)]
  1047. internal static extern void GetInertiaParameterInteractionContext(IntPtr interactionContext,
  1048. INERTIA_PARAMETER inertiaParameter, out float value);
  1049.  
  1050. [DllImport("ninput.dll", PreserveSig = false)]
  1051. internal static extern void SetCrossSlideParametersInteractionContext(IntPtr interactionContext,
  1052. int parameterCount, [MarshalAs(UnmanagedType.LPArray), In] CROSS_SLIDE_PARAMETER[] crossSlideParameters);
  1053.  
  1054. [DllImport("ninput.dll", PreserveSig = false)]
  1055. internal static extern void GetCrossSlideParameterInteractionContext(IntPtr interactionContext,
  1056. CROSS_SLIDE_THRESHOLD threshold, out float distance);
  1057.  
  1058. [DllImport("ninput.dll", PreserveSig = false)]
  1059. internal static extern void SetMouseWheelParameterInteractionContext(IntPtr interactionContext,
  1060. MOUSE_WHEEL_PARAMETER parameter, float value);
  1061.  
  1062. [DllImport("ninput.dll", PreserveSig = false)]
  1063. internal static extern void GetMouseWheelParameterInteractionContext(IntPtr interactionContext,
  1064. MOUSE_WHEEL_PARAMETER parameter, out float value);
  1065.  
  1066. [DllImport("ninput.dll", PreserveSig = false)]
  1067. internal static extern void ResetInteractionContext(IntPtr interactionContext);
  1068.  
  1069. [DllImport("ninput.dll", PreserveSig = false)]
  1070. internal static extern void GetStateInteractionContext(IntPtr interactionContext, IntPtr pointerInfo, out INTERACTION_STATE state);
  1071.  
  1072. [DllImport("ninput.dll", PreserveSig = false)]
  1073. internal static extern void AddPointerInteractionContext(IntPtr interactionContext, int pointerId);
  1074.  
  1075. [DllImport("ninput.dll", PreserveSig = false)]
  1076. internal static extern void RemovePointerInteractionContext(IntPtr interactionContext, int pointerId);
  1077.  
  1078. [DllImport("ninput.dll")]
  1079. internal static extern IntPtr ProcessPointerFramesInteractionContext(IntPtr interactionContext,
  1080. int entriesCount, int pointerCount, [MarshalAs(UnmanagedType.LPArray), In] POINTER_INFO[] pointerInfo);
  1081.  
  1082. [DllImport("ninput.dll", PreserveSig = false)]
  1083. internal static extern void BufferPointerPacketsInteractionContext(IntPtr interactionContext,
  1084. int entriesCount, [MarshalAs(UnmanagedType.LPArray), In] POINTER_INFO[] pointerInfo);
  1085.  
  1086. [DllImport("ninput.dll")]
  1087. internal static extern IntPtr ProcessBufferedPacketsInteractionContext(IntPtr interactionContext);
  1088.  
  1089. [DllImport("ninput.dll", PreserveSig = false)]
  1090. internal static extern void ProcessInertiaInteractionContext(IntPtr interactionContext);
  1091.  
  1092. [DllImport("ninput.dll", PreserveSig = false)]
  1093. internal static extern void StopInteractionContext(IntPtr interactionContext);
  1094.  
  1095. [DllImport("ninput.dll", PreserveSig = false)]
  1096. internal static extern void SetPivotInteractionContext(IntPtr interactionContext, float x, float y, float radius);
  1097.  
  1098. #endregion
  1099. }
  1100. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement