winform touch screen override WndProc --Win32.cs

WndProc

protected override void WndProc(ref Message m)
    {
        switch (m.Msg)
        {
            case Win32.WM_POINTERDOWN:
            case Win32.WM_POINTERUP:
            case Win32.WM_POINTERUPDATE:
            case Win32.WM_POINTERCAPTURECHANGED:
                break;

            default:
                base.WndProc(ref m);
                return;
        }
        int pointerID = Win32.GET_POINTER_ID(m.WParam);
        Win32.POINTER_INFO pi = new Win32.POINTER_INFO();
        if (!Win32.GetPointerInfo(pointerID, ref pi))
        {
            Win32.CheckLastError();
        }
        Point pt = PointToClient(pi.PtPixelLocation.ToPoint());
        MouseEventArgs me = new MouseEventArgs(System.Windows.Forms.MouseButtons.Left, 1, pt.X, pt.Y, 0);
        switch (m.Msg)
        {
            case Win32.WM_POINTERDOWN:
                    Console.WriteLine("TOCOU" + pt);
                    (Parent as Jogo).Form1_MouseDown((this as object), me);
                break;

            case Win32.WM_POINTERUP:
                    Console.WriteLine("LEVANTOU");
                    (Parent as Jogo).Form1_MouseUp((this as object), me);
                break;

            case Win32.WM_POINTERUPDATE:
                    //Console.WriteLine("UPDATE");
                    (Parent as Jogo).Form1_MouseMove((this as object), me);
                break;
        }
    }

Win32.cs

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Runtime.InteropServices;
using System.Threading;

namespace ICTest
{
    // 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<InteractionOutput> _inertiaQueue;
        static Dictionary<long, InteractionOutput> _listeners;
        static INTERACTION_CONTEXT_OUTPUT_CALLBACK _callback;
        static object _lockObj = new object();

        static Win32()
        {
            CursorInfoSize = Marshal.SizeOf(new CURSORINFO());
            _inertiaQueue = new Queue<InteractionOutput>();
            _listeners = new Dictionary<long, InteractionOutput>();
            _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
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值