/// <summary>
        /// 使用消息机制模拟触摸
        /// <remarks>开启触摸模拟后,原有的 WPF 触摸将会无法再次使用</remarks>
        /// <remarks>理论上,不管触摸是否真的失效,禁用后再添加模拟触摸,触摸流程正常</remarks>
        /// </summary>
        public static void RegisterMessageTouch(Window window)
        {
            if (ReferenceEquals(window, null))
            {
                throw new ArgumentNullException(nameof(window));
            }
            var hWnd = new WindowInteropHelper(window).Handle;

            if (hWnd == IntPtr.Zero)
            {
                throw new InvalidOperationException("请在SourceInitialized之后调用这个方法");
            }
            //禁用原有WPF触摸
            //如果真的触摸失效了,可以不执行禁用逻辑。但是触摸失效判断...emmm可能不准确,所以添加模拟触摸前禁用原有WPF触摸,保证整个触摸流程不重复不缺失。
            DisableWpfTouch();
            //注册触摸消息
            TouchNativeMethods.RegisterTouchWindow(hWnd, TouchNativeMethods.TWF_WANTPALM);
            //监听窗口触摸消息
            var source = HwndSource.FromHwnd(hWnd);

            Debug.Assert(source != null);
            source.AddHook((IntPtr hwnd, int msg, IntPtr param, IntPtr lParam, ref bool handled) =>
            {
                HandleWindowProc(window, msg, param, lParam, ref handled);
                return(IntPtr.Zero);
            });
        }
        private void OpenTouchCheckBox_OnClick(object sender, RoutedEventArgs e)
        {
            var isChecked = OpenTouchCheckBox.IsChecked ?? false;

            TouchSupportOperationHelper.HasOpenedTouchFix = isChecked;
            if (isChecked)
            {
                TouchSupportOperationHelper.RegisterMessageTouch(this);
            }
            var isTouch = TouchNativeMethods.IsTouchWindow(new WindowInteropHelper(this).Handle, 0x00000002);

            if (TouchSupportOperationHelper.HasDisabledTouch & TouchSupportOperationHelper.HasOpenedTouchFix)
            {
                TouchSupportOperationHelper.RegisterMessageTouch(this);
            }
        }
        /// <summary>
        /// 处理窗口消息
        /// </summary>
        /// <param name="window"></param>
        /// <param name="msg"></param>
        /// <param name="wParam"></param>
        /// <param name="lParam"></param>
        /// <param name="handled"></param>
        private static void HandleWindowProc(Window window, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
        {
            if (msg == TouchNativeMethods.WM_TOUCH)
            {
                var inputCount = wParam.ToInt32() & 0xffff;
                var inputs     = new TouchNativeMethods.TOUCHINPUT[inputCount];

                if (TouchNativeMethods.GetTouchInputInfo(lParam, inputCount, inputs, TouchNativeMethods.TouchInputSize))
                {
                    for (int i = 0; i < inputCount; i++)
                    {
                        var input = inputs[i];
                        //FakeTouchInputToPenContext0(window, input, inputCount);
                        //FakeTouchInputToPenContext1(window, input, inputCount);
                        FakeTouchInputToWindow(window, input);
                    }
                }

                TouchNativeMethods.CloseTouchInputHandle(lParam);
                handled = true;
            }
        }
 private void MainWindow_Loaded(object sender, RoutedEventArgs e)
 {
     var isTouch = TouchNativeMethods.IsTouchWindow(new WindowInteropHelper(this).Handle, 0x00000002);
 }