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:
( 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
{
internal interface IInteractionHandler
{
void ProcessInteractionEvent ( InteractionOutput output) ;
}
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 ,
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
}
}