using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Runtime.InteropServices; using System.Threading; namespace POSV.Component { // Destination object for touch/mouse/pen gestures. internal interface IInteractionHandler { void ProcessInteractionEvent(InteractionOutput output); } // Passed as an argument to ProcessInteractionEvent. internal class InteractionOutput { internal Win32.INTERACTION_CONTEXT_OUTPUT Data; internal IntPtr InteractionContext { get { return _interactionContext; } } internal bool IsBegin() { return (Data.InteractionFlags & Win32.INTERACTION_FLAGS.BEGIN) != 0; } internal bool IsInertia() { return (Data.InteractionFlags & Win32.INTERACTION_FLAGS.INERTIA) != 0; } internal bool IsEnd() { return (Data.InteractionFlags & Win32.INTERACTION_FLAGS.END) != 0; } #region ** infrastructure IntPtr _interactionContext; IInteractionHandler _interactionHandler; SynchronizationContext _syncContext; internal InteractionOutput(IntPtr interactionContext , IInteractionHandler interactionHandler , SynchronizationContext syncContext) { _interactionContext = interactionContext; _interactionHandler = interactionHandler; _syncContext = syncContext; Alive = true; } internal bool Alive { get; set; } internal IInteractionHandler InteractionHandler { get { return _interactionHandler; } } internal SynchronizationContext SyncContext { get { return _syncContext; } } #endregion } [System.Security.SuppressUnmanagedCodeSecurity()] internal static class Win32 { //------------------------------------------------------------------ #region ** fields and utility methods internal static readonly int CursorInfoSize; #region ** infrastructure static Timer _timer; static Queue _inertiaQueue; static Dictionary _listeners; static INTERACTION_CONTEXT_OUTPUT_CALLBACK _callback; static object _lockObj = new object(); static Win32() { CursorInfoSize = Marshal.SizeOf(new CURSORINFO()); _inertiaQueue = new Queue(); _listeners = new Dictionary(); _timer = new Timer(TimerElapsed , null , 100 , 15); _callback = CallbackFunction; } static void TimerElapsed(object state) { InteractionOutput[] items = null; lock (_lockObj) { if (_inertiaQueue.Count > 0) { items = _inertiaQueue.ToArray(); _inertiaQueue.Clear(); } } if (items != null) { for (int i = 0; i < items.Length; i++) { InteractionOutput io = items[i]; for (int j = 0; j < i; j++) { if (items[j].InteractionContext == io.InteractionContext) { io = null; break; } } if (io != null && io.Alive) { io.SyncContext.Post(delegate (object obj) { InteractionOutput m = (InteractionOutput)obj; if (m.Alive) { ProcessInertiaInteractionContext(m.InteractionContext); } } , io); } } } } static void CallbackFunction(IntPtr ic , IntPtr outputPtr) { InteractionOutput io; lock (_lockObj) { _listeners.TryGetValue(ic.ToInt64() , out io); } if (io != null) { io.Data = (INTERACTION_CONTEXT_OUTPUT)Marshal.PtrToStructure(outputPtr , typeof(INTERACTION_CONTEXT_OUTPUT)); io.InteractionHandler.ProcessInteractionEvent(io); if (io.Alive && (io.Data.InteractionFlags & INTERACTION_FLAGS.INERTIA) != 0 && (io.Data.InteractionFlags & (INTERACTION_FLAGS.END | INTERACTION_FLAGS.CANCEL)) == 0) { lock (_lockObj) { _inertiaQueue.Enqueue(io); } } } } #endregion internal static IntPtr CreateInteractionContext(IInteractionHandler interactionHandler , SynchronizationContext syncContext) { IntPtr ic; CreateInteractionContext(out ic); InteractionOutput io = new InteractionOutput(ic , interactionHandler , syncContext); lock (_lockObj) { _listeners.Add(ic.ToInt64() , io); } RegisterOutputCallbackInteractionContext(ic , Marshal.GetFunctionPointerForDelegate(_callback) , ic); return ic; } internal static void DisposeInteractionContext(IntPtr interactionContext) { if (interactionContext != IntPtr.Zero) { InteractionOutput io; lock (_lockObj) { if (_listeners.TryGetValue(interactionContext.ToInt64() , out io)) { io.Alive = false; _listeners.Remove(interactionContext.ToInt64()); } } DestroyInteractionContext(interactionContext); } } internal static int GET_POINTER_ID(IntPtr wParam) { return LOWORD(wParam); } internal static bool IS_POINTER_FLAG_SET(IntPtr wParam , POINTER_MESSAGE_FLAG flag) { return (HIWORD(wParam) & (int)flag) != 0; } internal static int HIWORD(IntPtr wParam) { return (int)((wParam.ToInt64() >> 16) & 0xffff); } internal static int LOWORD(IntPtr wParam) { return (int)(wParam.ToInt64() & 0xffff); } internal static int GET_WHEEL_DELTA(IntPtr wParam) { return GET_Y(wParam); } internal static int GET_X(IntPtr lParam) { return (int)((short)(lParam.ToInt64() & 0xffff)); } internal static int GET_Y(IntPtr lParam) { return (int)((short)((lParam.ToInt64() >> 16) & 0xffff)); } internal static bool SUCCEEDED(IntPtr hr) { return unchecked((int)hr.ToInt64()) >= 0; } internal static bool FAILED(IntPtr hr) { return unchecked((int)hr.ToInt64()) < 0; } internal static string GetMessageForHR(IntPtr hr) { Exception ex = Marshal.GetExceptionForHR(unchecked((int)hr.ToInt64())); return ex != null ? ex.Message : string.Empty; } internal static bool IsCursorSuppressed() { CURSORINFO ci = new CURSORINFO(); ci.Size = CursorInfoSize; if (GetCursorInfo(ref ci)) { if (ci.Flags == CURSOR_STATE.SUPPRESSED) { return true; } } return false; } internal static void CheckLastError() { int errCode = Marshal.GetLastWin32Error(); if (errCode != 0) { throw new Win32Exception(errCode); } } #endregion //------------------------------------------------------------------ #region ** misc constants internal const int GWFS_INCLUDE_ANCESTORS = 0x00000001; internal enum FEEDBACK_TYPE { TOUCH_CONTACTVISUALIZATION = 1, PEN_BARRELVISUALIZATION = 2, PEN_TAP = 3, PEN_DOUBLETAP = 4, PEN_PRESSANDHOLD = 5, PEN_RIGHTTAP = 6, TOUCH_TAP = 7, TOUCH_DOUBLETAP = 8, TOUCH_PRESSANDHOLD = 9, TOUCH_RIGHTTAP = 10, GESTURE_PRESSANDTAP = 11 } internal const int SPI_GETCONTACTVISUALIZATION = 0x2018, SPI_SETCONTACTVISUALIZATION = 0x2019, SPI_GETGESTUREVISUALIZATION = 0x201A, SPI_SETGESTUREVISUALIZATION = 0x201B; [Flags] internal enum CONTACTVISUALIZATION { OFF = 0x0000, ON = 0x0001, PRESENTATIONMODE = 0x0002, } [Flags] internal enum GESTUREVISUALIZATION { OFF = 0x0000, ON = 0x001F, TAP = 0x0001, DOUBLETAP = 0x0002, PRESSANDTAP = 0x0004, PRESSANDHOLD = 0x0008, RIGHTTAP = 0x0010, } internal enum CURSOR_STATE { HIDDEN, SHOWING, SUPPRESSED } #endregion //------------------------------------------------------------------ #region ** pointer constants internal const int WM_PARENTNOTIFY = 0x0210, WM_NCPOINTERUPDATE = 0x0241, WM_NCPOINTERDOWN = 0x0242, WM_NCPOINTERUP = 0x0243, WM_POINTERUPDATE = 0x0245, WM_POINTERDOWN = 0x0246, WM_POINTERUP = 0x0247, WM_POINTERENTER = 0x0249, WM_POINTERLEAVE = 0x024A, WM_POINTERACTIVATE = 0x024B, WM_POINTERCAPTURECHANGED = 0x024C, WM_POINTERWHEEL = 0x024E, WM_POINTERHWHEEL = 0x024F, // WM_POINTERACTIVATE return codes PA_ACTIVATE = 1, PA_NOACTIVATE = 3, MAX_TOUCH_COUNT = 256; internal enum POINTER_INPUT_TYPE { POINTER = 0x00000001, TOUCH = 0x00000002, PEN = 0x00000003, MOUSE = 0x00000004 } [Flags] internal enum POINTER_FLAGS { NONE = 0x00000000, NEW = 0x00000001, INRANGE = 0x00000002, INCONTACT = 0x00000004, FIRSTBUTTON = 0x00000010, SECONDBUTTON = 0x00000020, THIRDBUTTON = 0x00000040, FOURTHBUTTON = 0x00000080, FIFTHBUTTON = 0x00000100, PRIMARY = 0x00002000, CONFIDENCE = 0x00004000, CANCELED = 0x00008000, DOWN = 0x00010000, UPDATE = 0x00020000, UP = 0x00040000, WHEEL = 0x00080000, HWHEEL = 0x00100000, CAPTURECHANGED = 0x00200000, } [Flags] internal enum VIRTUAL_KEY_STATES { NONE = 0x0000, LBUTTON = 0x0001, RBUTTON = 0x0002, SHIFT = 0x0004, CTRL = 0x0008, MBUTTON = 0x0010, XBUTTON1 = 0x0020, XBUTTON2 = 0x0040 } internal enum POINTER_CHANGE { NONE, FIRSTBUTTON_DOWN, FIRSTBUTTON_UP, SECONDBUTTON_DOWN, SECONDBUTTON_UP, THIRDBUTTON_DOWN, THIRDBUTTON_UP, FOURTHBUTTON_DOWN, FOURTHBUTTON_UP, FIFTHBUTTON_DOWN, FIFTHBUTTON_UP } [Flags] internal enum TOUCH_FLAGS { NONE = 0x00000000 } [Flags] internal enum TOUCH_MASK { NONE = 0x00000000, CONTACTAREA = 0x00000001, ORIENTATION = 0x00000002, PRESSURE = 0x00000004, } [Flags] internal enum PEN_FLAGS { NONE = 0x00000000, BARREL = 0x00000001, INVERTED = 0x00000002, ERASER = 0x00000004, } [Flags] internal enum PEN_MASK { NONE = 0x00000000, PRESSURE = 0x00000001, ROTATION = 0x00000002, TILT_X = 0x00000004, TILT_Y = 0x00000008, } [Flags] internal enum POINTER_MESSAGE_FLAG { NEW = 0x00000001, INRANGE = 0x00000002, INCONTACT = 0x00000004, FIRSTBUTTON = 0x00000010, SECONDBUTTON = 0x00000020, THIRDBUTTON = 0x00000040, FOURTHBUTTON = 0x00000080, FIFTHBUTTON = 0x00000100, PRIMARY = 0x00002000, CONFIDENCE = 0x00004000, CANCELED = 0x00008000, } internal enum TOUCH_FEEDBACK { DEFAULT = 0x1, INDIRECT = 0x2, NONE = 0x3 } #endregion //------------------------------------------------------------------ #region ** interaction context constants internal enum INTERACTION { NONE = 0x00000000, MANIPULATION = 0x00000001, TAP = 0x00000002, SECONDARY_TAP = 0x00000003, HOLD = 0x00000004, DRAG = 0x00000005, CROSS_SLIDE = 0x00000006 } [Flags] internal enum INTERACTION_FLAGS { NONE = 0x00000000, BEGIN = 0x00000001, END = 0x00000002, CANCEL = 0x00000004, INERTIA = 0x00000008 } [Flags] internal enum INTERACTION_CONFIGURATION_FLAGS { NONE = 0x00000000, MANIPULATION = 0x00000001, MANIPULATION_TRANSLATION_X = 0x00000002, MANIPULATION_TRANSLATION_Y = 0x00000004, MANIPULATION_ROTATION = 0x00000008, MANIPULATION_SCALING = 0x00000010, MANIPULATION_TRANSLATION_INERTIA = 0x00000020, MANIPULATION_ROTATION_INERTIA = 0x00000040, MANIPULATION_SCALING_INERTIA = 0x00000080, MANIPULATION_RAILS_X = 0x00000100, MANIPULATION_RAILS_Y = 0x00000200, MANIPULATION_EXACT = 0x00000400, CROSS_SLIDE = 0x00000001, CROSS_SLIDE_HORIZONTAL = 0x00000002, CROSS_SLIDE_SELECT = 0x00000004, CROSS_SLIDE_SPEED_BUMP = 0x00000008, CROSS_SLIDE_REARRANGE = 0x00000010, CROSS_SLIDE_EXACT = 0x00000020, TAP = 0x00000001, TAP_DOUBLE = 0x00000002, SECONDARY_TAP = 0x00000001, HOLD = 0x00000001, HOLD_MOUSE = 0x00000002, DRAG = 0x00000001 } internal enum INERTIA_PARAMETER { TRANSLATION_DECELERATION = 0x00000001, TRANSLATION_DISPLACEMENT = 0x00000002, ROTATION_DECELERATION = 0x00000003, ROTATION_ANGLE = 0x00000004, EXPANSION_DECELERATION = 0x00000005, EXPANSION_EXPANSION = 0x00000006 } internal enum INTERACTION_STATE { IDLE = 0x00000000, IN_INTERACTION = 0x00000001, POSSIBLE_DOUBLE_TAP = 0x00000002 } internal enum INTERACTION_CONTEXT_PROPERTY { MEASUREMENT_UNITS = 0x00000001, INTERACTION_UI_FEEDBACK = 0x00000002, FILTER_POINTERS = 0x00000003 } internal const int ICP_MEASUREMENT_UNITS_HIMETRIC = 0, ICP_MEASUREMENT_UNITS_SCREEN = 1, ICP_UI_FEEDBACK_OFF = 0, ICP_UI_FEEDBACK_ON = 1, ICP_FILTER_POINTERS_OFF = 0, ICP_FILTER_POINTERS_ON = 1; internal enum CROSS_SLIDE_THRESHOLD { SELECT_START = 0x00000000, SPEED_BUMP_START = 0x00000001, SPEED_BUMP_END = 0x00000002, REARRANGE_START = 0x00000003, COUNT = 0x00000004 } [Flags] internal enum CROSS_SLIDE_FLAGS { NONE = 0x00000000, SELECT = 0x00000001, SPEED_BUMP = 0x00000002, REARRANGE = 0x00000004 } internal enum MOUSE_WHEEL_PARAMETER { CHAR_TRANSLATION_X = 0x00000001, CHAR_TRANSLATION_Y = 0x00000002, DELTA_SCALE = 0x00000003, DELTA_ROTATION = 0x00000004, PAGE_TRANSLATION_X = 0x00000005, PAGE_TRANSLATION_Y = 0x00000006 } internal enum MANIPULATION_RAILS_STATE { UNDECIDED = 0x00000000, FREE = 0x00000001, RAILED = 0x00000002, } #endregion //------------------------------------------------------------------ #region ** misc structs #region CURSORINFO [StructLayout(LayoutKind.Sequential)] internal struct CURSORINFO { public int Size; public CURSOR_STATE Flags; public IntPtr Cursor; [MarshalAs(UnmanagedType.Struct)] public POINT ScreenPos; } #endregion #region POINT [StructLayout(LayoutKind.Sequential)] internal struct POINT { public int X; public int Y; public POINT(int x , int y) { X = x; Y = y; } public POINT(Point pt) { X = pt.X; Y = pt.Y; } public Point ToPoint() { return new Point(X , Y); } public void AssignTo(ref Point destination) { destination.X = X; destination.Y = Y; } public void CopyFrom(Point source) { X = source.X; Y = source.Y; } public void CopyFrom(POINT source) { X = source.X; Y = source.Y; } } #endregion #region RECT [StructLayout(LayoutKind.Sequential)] internal struct RECT { public int Left; public int Top; public int Right; public int Bottom; public RECT(Rectangle source) { Left = source.Left; Top = source.Top; Right = source.Right; Bottom = source.Bottom; } public RECT(int x , int y , int width , int height) { Left = x; Top = y; Right = Left + width; Bottom = Top + height; } public int Width { get { return Right - Left; } } public int Height { get { return Bottom - Top; } } public Rectangle ToRectangle() { return new Rectangle(Left , Top , Width , Height); } public void Inflate(int dx , int dy) { Left -= dx; Top -= dy; Right += dx; Bottom += dy; } public void Deflate(int leftMargin , int topMargin , int rightMargin , int bottomMargin) { Left += leftMargin; Top += topMargin; Right -= rightMargin; Bottom -= bottomMargin; if (Bottom < Top) { Bottom = Top; } if (Right < Left) { Right = Left; } } public void Offset(int dx , int dy) { Left += dx; Top += dy; Right += dx; Bottom += dy; } } #endregion #endregion //------------------------------------------------------------------ #region ** pointer structs #region POINTER_INFO [StructLayout(LayoutKind.Sequential)] internal struct POINTER_INFO { public POINTER_INPUT_TYPE pointerType; public int PointerID; public int FrameID; public POINTER_FLAGS PointerFlags; public IntPtr SourceDevice; public IntPtr WindowTarget; [MarshalAs(UnmanagedType.Struct)] public POINT PtPixelLocation; [MarshalAs(UnmanagedType.Struct)] public POINT PtPixelLocationRaw; [MarshalAs(UnmanagedType.Struct)] public POINT PtHimetricLocation; [MarshalAs(UnmanagedType.Struct)] public POINT PtHimetricLocationRaw; public uint Time; public uint HistoryCount; public uint InputData; public VIRTUAL_KEY_STATES KeyStates; public long PerformanceCount; public int ButtonChangeType; } #endregion #region POINTER_TOUCH_INFO [StructLayout(LayoutKind.Sequential)] internal struct POINTER_TOUCH_INFO { [MarshalAs(UnmanagedType.Struct)] public POINTER_INFO PointerInfo; public TOUCH_FLAGS TouchFlags; public TOUCH_MASK TouchMask; [MarshalAs(UnmanagedType.Struct)] public RECT ContactArea; [MarshalAs(UnmanagedType.Struct)] public RECT ContactAreaRaw; public uint Orientation; public uint Pressure; } #endregion #region POINTER_PEN_INFO [StructLayout(LayoutKind.Sequential)] internal struct POINTER_PEN_INFO { [MarshalAs(UnmanagedType.Struct)] public POINTER_INFO PointerInfo; public PEN_FLAGS PenFlags; public PEN_MASK PenMask; public uint Pressure; public uint Rotation; public int TiltX; public int TiltY; } #endregion #endregion //------------------------------------------------------------------ #region ** interaction context structs #region MANIPULATION_TRANSFORM [StructLayout(LayoutKind.Sequential)] internal struct MANIPULATION_TRANSFORM { public float TranslationX; public float TranslationY; public float Scale; public float Expansion; public float Rotation; } #endregion #region MANIPULATION_VELOCITY [StructLayout(LayoutKind.Sequential)] internal struct MANIPULATION_VELOCITY { public float VelocityX; public float VelocityY; public float VelocityExpansion; public float VelocityAngular; } #endregion #region INTERACTION_ARGUMENTS_MANIPULATION [StructLayout(LayoutKind.Sequential)] internal struct INTERACTION_ARGUMENTS_MANIPULATION { [MarshalAs(UnmanagedType.Struct)] public MANIPULATION_TRANSFORM Delta; [MarshalAs(UnmanagedType.Struct)] public MANIPULATION_TRANSFORM Cumulative; [MarshalAs(UnmanagedType.Struct)] public MANIPULATION_VELOCITY Velocity; public MANIPULATION_RAILS_STATE RailsState; } #endregion #region INTERACTION_ARGUMENTS_TAP [StructLayout(LayoutKind.Sequential)] internal struct INTERACTION_ARGUMENTS_TAP { public int Count; } #endregion #region INTERACTION_ARGUMENTS_CROSS_SLIDE [StructLayout(LayoutKind.Sequential)] internal struct INTERACTION_ARGUMENTS_CROSS_SLIDE { public CROSS_SLIDE_FLAGS Flags; } #endregion #region INTERACTION_CONTEXT_OUTPUT [StructLayout(LayoutKind.Explicit)] internal struct INTERACTION_CONTEXT_OUTPUT { [FieldOffset(0)] public INTERACTION Interaction; [FieldOffset(4)] public INTERACTION_FLAGS InteractionFlags; [FieldOffset(8)] public POINTER_INPUT_TYPE InputType; [FieldOffset(12)] public float X; [FieldOffset(16)] public float Y; [FieldOffset(20)] [MarshalAs(UnmanagedType.Struct)] public INTERACTION_ARGUMENTS_MANIPULATION Manipulation; [FieldOffset(20)] [MarshalAs(UnmanagedType.Struct)] public INTERACTION_ARGUMENTS_TAP Tap; [FieldOffset(20)] [MarshalAs(UnmanagedType.Struct)] public INTERACTION_ARGUMENTS_CROSS_SLIDE CrossSlide; } #endregion #region INTERACTION_CONTEXT_CONFIGURATION [StructLayout(LayoutKind.Sequential)] internal struct INTERACTION_CONTEXT_CONFIGURATION { public INTERACTION Interaction; public INTERACTION_CONFIGURATION_FLAGS Enable; public INTERACTION_CONTEXT_CONFIGURATION(INTERACTION interaction , INTERACTION_CONFIGURATION_FLAGS enable) { Interaction = interaction; Enable = enable; } } #endregion #region CROSS_SLIDE_PARAMETER [StructLayout(LayoutKind.Sequential)] internal struct CROSS_SLIDE_PARAMETER { public CROSS_SLIDE_THRESHOLD Threshold; public float Distance; } #endregion #endregion //------------------------------------------------------------------ #region ** misc methods [DllImport("gdi32.dll" , ExactSpelling = true , EntryPoint = "CreateICW" , CharSet = CharSet.Unicode)] internal static extern IntPtr CreateIC(string lpszDriverName , IntPtr lpszDeviceName , IntPtr lpszOutput , IntPtr lpInitData); [DllImport("gdi32.dll" , ExactSpelling = true)] internal static extern bool DeleteDC(IntPtr hDC); [DllImport("gdi32.dll" , ExactSpelling = true)] internal static extern int GetDeviceCaps(IntPtr hDC , int index); [DllImport("user32.dll" , SetLastError = true , ExactSpelling = true , EntryPoint = "SystemParametersInfoW" , CharSet = CharSet.Unicode)] internal static extern bool SystemParametersInfo(int uiAction , int uiParam , IntPtr pvParam , int fWinIni); [DllImport("user32.dll" , SetLastError = true)] internal static extern bool GetWindowFeedbackSetting(IntPtr hWnd , FEEDBACK_TYPE feedback , int dwFlags , ref int pSize , out int config); [DllImport("user32.dll" , SetLastError = true)] internal static extern bool SetWindowFeedbackSetting(IntPtr hWnd , FEEDBACK_TYPE feedback , int dwFlags , int size , ref int config); [DllImport("user32.dll" , SetLastError = true)] internal static extern bool SetWindowFeedbackSetting(IntPtr hWnd , FEEDBACK_TYPE feedback , int dwFlags , int size , IntPtr config); [DllImport("user32.dll" , SetLastError = true)] internal static extern bool GetCursorInfo(ref CURSORINFO ci); [DllImport("uxtheme.dll")] internal static extern bool BeginPanningFeedback(IntPtr hWnd); [DllImport("uxtheme.dll")] internal static extern bool UpdatePanningFeedback(IntPtr hWnd , int lTotalOverpanOffsetX , int lTotalOverpanOffsetY , bool fInInertia); [DllImport("uxtheme.dll")] internal static extern bool EndPanningFeedback(IntPtr hWnd , bool fAnimateBack); #endregion //------------------------------------------------------------------ #region ** pointer methods [DllImport("user32.dll" , SetLastError = true)] internal static extern bool InitializeTouchInjection(int maxCount , TOUCH_FEEDBACK feedbackMode); [DllImport("user32.dll" , SetLastError = true)] internal static extern bool InjectTouchInput(int count , [MarshalAs(UnmanagedType.LPArray), In] POINTER_TOUCH_INFO[] contacts); [DllImport("user32.dll" , SetLastError = true)] internal static extern bool GetPointerType(int pointerID , out POINTER_INPUT_TYPE pointerType); [DllImport("user32.dll" , SetLastError = true)] internal static extern bool GetPointerInfo(int pointerID , ref POINTER_INFO pointerInfo); [DllImport("user32.dll" , SetLastError = true)] internal static extern bool GetPointerInfoHistory(int pointerID , ref int entriesCount , [MarshalAs(UnmanagedType.LPArray), In, Out] POINTER_INFO[] pointerInfo); [DllImport("user32.dll" , SetLastError = true)] internal static extern bool GetPointerInfoHistory(int pointerID , ref int entriesCount , IntPtr pointerInfo); [DllImport("user32.dll" , SetLastError = true)] internal static extern bool GetPointerFrameInfo(int pointerID , ref int pointerCount , [MarshalAs(UnmanagedType.LPArray), In, Out] POINTER_INFO[] pointerInfo); [DllImport("user32.dll" , SetLastError = true)] internal static extern bool GetPointerFrameInfo(int pointerID , ref int pointerCount , IntPtr pointerInfo); [DllImport("user32.dll" , SetLastError = true)] internal static extern bool GetPointerFrameInfoHistory(int pointerID , ref int entriesCount , ref int pointerCount , [MarshalAs(UnmanagedType.LPArray), In, Out] POINTER_INFO[] pointerInfo); [DllImport("user32.dll" , SetLastError = true)] internal static extern bool GetPointerFrameInfoHistory(int pointerID , ref int entriesCount , ref int pointerCount , IntPtr pointerInfo); [DllImport("user32.dll" , SetLastError = true)] internal static extern bool GetPointerTouchInfo(int pointerID , ref POINTER_TOUCH_INFO touchInfo); [DllImport("user32.dll" , SetLastError = true)] internal static extern bool GetPointerFrameTouchInfo(int pointerID , ref int pointerCount , [MarshalAs(UnmanagedType.LPArray), In, Out] POINTER_TOUCH_INFO[] touchInfo); [DllImport("user32.dll" , SetLastError = true)] internal static extern bool GetPointerFrameTouchInfo(int pointerID , ref int pointerCount , IntPtr touchInfo); [DllImport("user32.dll" , SetLastError = true)] internal static extern bool GetPointerPenInfo(int pointerID , ref POINTER_PEN_INFO penInfo); [DllImport("user32.dll" , SetLastError = true)] internal static extern bool GetPointerFramePenInfo(int pointerID , ref int pointerCount , [MarshalAs(UnmanagedType.LPArray), In, Out] POINTER_PEN_INFO[] penInfo); [DllImport("user32.dll" , SetLastError = true)] internal static extern bool GetPointerFramePenInfo(int pointerID , ref int pointerCount , IntPtr penInfo); [DllImport("user32.dll" , SetLastError = true)] internal static extern bool SkipPointerFrameMessages(int pointerID); [DllImport("user32.dll" , SetLastError = true)] internal static extern bool EnableMouseInPointer([MarshalAs(UnmanagedType.Bool), In] bool enable); [DllImport("user32.dll")] internal static extern bool IsMouseInPointerEnabled(); #endregion //------------------------------------------------------------------ #region ** interaction context methods [DllImport("ninput.dll" , PreserveSig = false)] static extern void CreateInteractionContext(out IntPtr interactionContext); [DllImport("ninput.dll" , PreserveSig = false)] static extern void DestroyInteractionContext(IntPtr interactionContext); [UnmanagedFunctionPointer(CallingConvention.StdCall)] delegate void INTERACTION_CONTEXT_OUTPUT_CALLBACK(IntPtr clientData , IntPtr output); [DllImport("ninput.dll" , PreserveSig = false)] static extern void RegisterOutputCallbackInteractionContext(IntPtr interactionContext , IntPtr callbackFunc , IntPtr clientData); [DllImport("ninput.dll" , PreserveSig = false)] internal static extern void SetInteractionConfigurationInteractionContext(IntPtr interactionContext , int configurationCount , [MarshalAs(UnmanagedType.LPArray), In] INTERACTION_CONTEXT_CONFIGURATION[] configuration); [DllImport("ninput.dll" , PreserveSig = false)] internal static extern void GetInteractionConfigurationInteractionContext(IntPtr interactionContext , int configurationCount , [MarshalAs(UnmanagedType.LPArray), In, Out] INTERACTION_CONTEXT_CONFIGURATION[] configuration); [DllImport("ninput.dll" , PreserveSig = false)] internal static extern void SetPropertyInteractionContext(IntPtr interactionContext , INTERACTION_CONTEXT_PROPERTY contextProperty , int value); [DllImport("ninput.dll" , PreserveSig = false)] internal static extern void GetPropertyInteractionContext(IntPtr interactionContext , INTERACTION_CONTEXT_PROPERTY contextProperty , out int value); [DllImport("ninput.dll" , PreserveSig = false)] internal static extern void SetInertiaParameterInteractionContext(IntPtr interactionContext , INERTIA_PARAMETER inertiaParameter , float value); [DllImport("ninput.dll" , PreserveSig = false)] internal static extern void GetInertiaParameterInteractionContext(IntPtr interactionContext , INERTIA_PARAMETER inertiaParameter , out float value); [DllImport("ninput.dll" , PreserveSig = false)] internal static extern void SetCrossSlideParametersInteractionContext(IntPtr interactionContext , int parameterCount , [MarshalAs(UnmanagedType.LPArray), In] CROSS_SLIDE_PARAMETER[] crossSlideParameters); [DllImport("ninput.dll" , PreserveSig = false)] internal static extern void GetCrossSlideParameterInteractionContext(IntPtr interactionContext , CROSS_SLIDE_THRESHOLD threshold , out float distance); [DllImport("ninput.dll" , PreserveSig = false)] internal static extern void SetMouseWheelParameterInteractionContext(IntPtr interactionContext , MOUSE_WHEEL_PARAMETER parameter , float value); [DllImport("ninput.dll" , PreserveSig = false)] internal static extern void GetMouseWheelParameterInteractionContext(IntPtr interactionContext , MOUSE_WHEEL_PARAMETER parameter , out float value); [DllImport("ninput.dll" , PreserveSig = false)] internal static extern void ResetInteractionContext(IntPtr interactionContext); [DllImport("ninput.dll" , PreserveSig = false)] internal static extern void GetStateInteractionContext(IntPtr interactionContext , IntPtr pointerInfo , out INTERACTION_STATE state); [DllImport("ninput.dll" , PreserveSig = false)] internal static extern void AddPointerInteractionContext(IntPtr interactionContext , int pointerId); [DllImport("ninput.dll" , PreserveSig = false)] internal static extern void RemovePointerInteractionContext(IntPtr interactionContext , int pointerId); [DllImport("ninput.dll")] internal static extern IntPtr ProcessPointerFramesInteractionContext(IntPtr interactionContext , int entriesCount , int pointerCount , [MarshalAs(UnmanagedType.LPArray), In] POINTER_INFO[] pointerInfo); [DllImport("ninput.dll" , PreserveSig = false)] internal static extern void BufferPointerPacketsInteractionContext(IntPtr interactionContext , int entriesCount , [MarshalAs(UnmanagedType.LPArray), In] POINTER_INFO[] pointerInfo); [DllImport("ninput.dll")] internal static extern IntPtr ProcessBufferedPacketsInteractionContext(IntPtr interactionContext); [DllImport("ninput.dll" , PreserveSig = false)] internal static extern void ProcessInertiaInteractionContext(IntPtr interactionContext); [DllImport("ninput.dll" , PreserveSig = false)] internal static extern void StopInteractionContext(IntPtr interactionContext); [DllImport("ninput.dll" , PreserveSig = false)] internal static extern void SetPivotInteractionContext(IntPtr interactionContext , float x , float y , float radius); #endregion } }