check point

This commit is contained in:
meelstorm
2025-07-14 12:03:59 +02:00
commit d3cb790bd9
431 changed files with 44078 additions and 0 deletions

View File

@@ -0,0 +1,341 @@
#region The MIT License (MIT)
//
// Copyright (c) 2011 Robert Prouse http://www.alteridem.net
//
// Permission is hereby granted, free of charge, to any person obtaining a copy of
// this software and associated documentation files (the "Software"), to deal in
// the Software without restriction, including without limitation the rights to use,
// copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
// Software, and to permit persons to whom the Software is furnished to do so,
// subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
// PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
//
#endregion
#region Using Directives
using System;
using System.Runtime.InteropServices;
#endregion
namespace MaterialSkin.Gesture
{
internal static class NativeMethods
{
#region Private Delegates
[UnmanagedFunctionPointer( CallingConvention.Cdecl )]
private delegate bool GetGestureInfoPtr( IntPtr gestureInfoHandle, ref GestureInfo pGestureInfo );
[UnmanagedFunctionPointer( CallingConvention.Cdecl )]
private delegate bool CloseGestureInfoHandlePtr( IntPtr gestureInfoHandle );
[UnmanagedFunctionPointer( CallingConvention.Cdecl )]
private delegate bool SetGestureConfigPtr( IntPtr hwnd, uint reserved, uint ids, GestureConfig[] configs, uint size );
private static readonly GetGestureInfoPtr _pGetGestureInfoPtr;
private static readonly CloseGestureInfoHandlePtr _pCloseGestureInfoHandle;
private static readonly SetGestureConfigPtr _pSetGestureConfig;
#endregion
#region Static Construction
static NativeMethods()
{
var user32 = new UnmanagedLibrary( "user32" );
_pGetGestureInfoPtr = user32.GetUnmanagedFunction<GetGestureInfoPtr>( "GetGestureInfo" );
_pCloseGestureInfoHandle = user32.GetUnmanagedFunction<CloseGestureInfoHandlePtr>( "CloseGestureInfoHandle" );
_pSetGestureConfig = user32.GetUnmanagedFunction<SetGestureConfigPtr>( "SetGestureConfig" );
}
#endregion
#region Public Interface
/// <summary>
/// Registers the HWND to receive all gestures.
/// </summary>
/// <remarks>
/// http://msdn.microsoft.com/en-us/library/windows/desktop/dd353231%28v=vs.85%29.aspx
/// </remarks>
/// <param name="hwnd">The HWND.</param>
/// <returns></returns>
public static bool SetGestureConfig( IntPtr hwnd )
{
if ( _pSetGestureConfig == null )
return false;
var configs = new[] { new GestureConfig( 0, GestureConfigurationFlag.GC_ALLGESTURES, 0 ) };
return SetGestureConfig(hwnd, configs);
}
/// <summary>
/// Registers the HWND to receive specific gestures.
/// </summary>
/// <remarks>
/// http://msdn.microsoft.com/en-us/library/windows/desktop/dd353231%28v=vs.85%29.aspx
/// </remarks>
/// <param name="hwnd">The HWND.</param>
/// <param name="configs">The gesture configurations</param>
/// <returns></returns>
public static bool SetGestureConfig( IntPtr hwnd, GestureConfig[] configs )
{
return _pSetGestureConfig( hwnd, 0, 1, configs, (uint)Marshal.SizeOf( typeof( GestureConfig ) ) );
}
/// <summary>
/// Gets the gesture info.
/// </summary>
/// <param name="gestureInfoHandle">The gesture info handle.</param>
/// <param name="gestureInfo">The gesture info.</param>
/// <returns></returns>
public static bool GetGestureInfo( IntPtr gestureInfoHandle, out GestureInfo gestureInfo )
{
gestureInfo = new GestureInfo();
if ( _pGetGestureInfoPtr == null )
return false;
gestureInfo.size = Marshal.SizeOf( gestureInfo );
return _pGetGestureInfoPtr( gestureInfoHandle, ref gestureInfo );
}
/// <summary>
/// Closes the gesture info handle.
/// </summary>
/// <param name="gestureInfoHandle">The gesture info handle.</param>
/// <returns></returns>
public static bool CloseGestureInfoHandle( IntPtr gestureInfoHandle )
{
if ( _pCloseGestureInfoHandle == null )
return false;
return _pCloseGestureInfoHandle( gestureInfoHandle );
}
#endregion
}
/// <summary>
/// Gesture configuration flags
/// </summary>
internal static class GestureConfigurationFlag
{
public const int GC_ALLGESTURES = 0x00000001;
public const int GC_ZOOM = 0x00000001;
public const int GC_PAN = 0x00000001;
public const int GC_PAN_WITH_SINGLE_FINGER_VERTICALLY = 0x00000002;
public const int GC_PAN_WITH_SINGLE_FINGER_HORIZONTALLY = 0x00000004;
public const int GC_PAN_WITH_GUTTER = 0x00000008;
public const int GC_PAN_WITH_INERTIA = 0x00000010;
public const int GC_ROTATE = 0x00000001;
public const int GC_TWOFINGERTAP = 0x00000001;
public const int GC_PRESSANDTAP = 0x00000001;
}
/// <summary>
/// Gesture flags - GestureInfo.flags
/// </summary>
[Flags]
public enum GestureFlags
{
/// <summary>
/// GF_BEGIN
/// </summary>
Begin = 0x1,
/// <summary>
/// GF_INERTIA
/// </summary>
Inertia = 0x2,
/// <summary>
/// GF_END
/// </summary>
End = 0x4
}
/// <summary>
/// Gesture IDs - GestureInfo.id
/// </summary>
public enum GestureId
{
/// <summary>
/// GID_BEGIN
/// </summary>
Begin = 1,
/// <summary>
/// GID_END
/// </summary>
End = 2,
/// <summary>
/// GID_ZOOM
/// </summary>
Zoom = 3,
/// <summary>
/// GID_PAN
/// </summary>
Pan = 4,
/// <summary>
/// GID_ROTATE
/// </summary>
Rotate = 5,
/// <summary>
/// GID_TWOFINGERTAP
/// </summary>
TwoFingerTap = 6,
/// <summary>
/// GID_PRESSANDTAP
/// </summary>
PressAndTap = 7
}
/// <summary>
/// Window Messages
/// </summary>
internal static class WindowMessage
{
public const int WM_TOUCH = 0x0240;
public const int WM_POINTERUPDATE =0x0245;
public const int WM_GESTURE = 0x0119;
public const int WM_GESTURENOTIFY = 0x011A;
public const int TOUCHEVENTF_MOVE = 0x0001;
public const int TOUCHEVENTF_DOWN = 0x0002;
public const int TOUCHEVENTF_UP = 0x0004;
public const int TOUCHEVENTF_INRANGE = 0x0008;
public const int TOUCHEVENTF_PRIMARY = 0x0010;
public const int TOUCHEVENTF_NOCOALESCE = 0x0020;
public const int TOUCHEVENTF_PEN = 0x0040;
// Touch input mask values (TOUCHINPUT.dwMask) [winuser.h]
public const int TOUCHINPUTMASKF_TIMEFROMSYSTEM = 0x0001; // the dwTime field contains a system generated value
public const int TOUCHINPUTMASKF_EXTRAINFO = 0x0002; // the dwExtraInfo field is valid
public const int TOUCHINPUTMASKF_CONTACTAREA = 0x0004; // the cxContact and cyContact fields are valid
}
[StructLayout( LayoutKind.Sequential )]
public struct Points
{
public short x;
public short y;
}
/// <summary>
/// Gesture configuration structure
/// </summary>
/// <remarks>
/// Used in SetGestureConfig and GetGestureConfig
/// http://msdn.microsoft.com/en-us/library/windows/desktop/dd353231%28v=vs.85%29.aspx
/// </remarks>
[StructLayout( LayoutKind.Sequential )]
public struct GestureConfig
{
public GestureConfig( uint id, uint want, uint block )
{
Id = id;
Want = want;
Block = block;
}
/// <summary>
/// The identifier for the type of configuration that will have messages enabled or disabled.
/// </summary>
public uint Id;
/// <summary>
/// The messages to enable.
/// </summary>
public uint Want;
/// <summary>
/// The messages to disable.
/// </summary>
public uint Block;
}
/// <summary>
/// Stores information about a gesture.
/// </summary>
/// <remarks>
/// - Pass the HGESTUREINFO received in the WM_GESTURE message lParam into the
/// GetGestureInfo function to retrieve this information.
/// - If cbExtraArgs is non-zero, pass the HGESTUREINFO received in the WM_GESTURE
/// message lParam into the GetGestureExtraArgs function to retrieve extended
/// argument information.
/// </remarks>
[StructLayout( LayoutKind.Sequential )]
public struct GestureInfo
{
/// <summary>
/// The size of the structure, in bytes. The caller must set this.
/// </summary>
public int size;
/// <summary>
/// The state of the gesture. Contains GestureFlags.
/// </summary>
public int flags;
/// <summary>
/// The identifier of the gesture command. Contains GestureId.
/// </summary>
public int id;
/// <summary>
/// A handle to the window that is targeted by this gesture.
/// </summary>
public IntPtr hwnd;
/// <summary>
/// A Points structure containing the coordinates associated with the gesture. These coordinates are always relative to the origin of the screen.
/// </summary>
public Points location;
/// <summary>
/// An internally used identifier for the structure.
/// </summary>
public int instanceId;
/// <summary>
/// An internally used identifier for the sequence.
/// </summary>
public int sequenceId;
/// <summary>
/// A 64-bit unsigned integer that contains the arguments for gestures that fit into 8 bytes.
/// </summary>
public Int64 arguments;
/// <summary>
/// The size, in bytes, of extra arguments that accompany this gesture.
/// </summary>
public int extraArguments;
/// <summary>
/// Gets a value indicating whether the <see cref="GestureFlags"/> Begin is set.
/// </summary>
public bool Begin
{
get { return ((GestureFlags)flags & GestureFlags.Begin) == GestureFlags.Begin; }
}
/// <summary>
/// Gets a value indicating whether the <see cref="GestureFlags"/> End is set.
/// </summary>
public bool End
{
get { return ((GestureFlags)flags & GestureFlags.End) == GestureFlags.End; }
}
/// <summary>
/// Gets a value indicating whether the <see cref="GestureFlags"/> Inertia is set
/// </summary>
public bool Inertia
{
get { return ((GestureFlags)flags & GestureFlags.Inertia) == GestureFlags.Inertia; }
}
}
}