/// <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); }