基于API:
[DllImport("User32.dll")] public static extern bool InitializeTouchInjection(uint maxCount = 256, TouchFeedback feedbackMode = TouchFeedback.DEFAULT); [DllImport("User32.dll")] public static extern bool InjectTouchInput(int count, [MarshalAs(UnmanagedType.LPArray), In] PointerTouchInfo[] contacts);
实现效果:点击按钮,自动触发TouchDown事件、获取TouchEventArgs参数得到坐标,创建Line并设置X1、Y1属性,紧接着触发TouchMove、TouchUp事件,得到TouchUp的TouchEventArgs设置Line的X2、Y2属性。
private void MainWindow_TouchUp(object sender, TouchEventArgs e){ System.Windows.Input.TouchPoint oPos = e.GetTouchPoint(this); this.ProxyLine.X2 = oPos.Position.X; this.ProxyLine.Y2 = oPos.Position.Y; this.GdRootZm.Children.Add(this.ProxyLine); Console.WriteLine("TouchID " + e.TouchDevice.Id + " TouchUp " + oPos.Position.X + " " + oPos.Position.Y);}private void MainWindow_TouchMove(object sender, TouchEventArgs e){ System.Windows.Input.TouchPoint oPos = e.GetTouchPoint(this); Console.WriteLine("TouchID " + e.TouchDevice.Id + " TouchMove " + oPos.Position.X + " " + oPos.Position.Y);}private Line ProxyLine;private void MainWindow_TouchDown(object sender, TouchEventArgs e){ System.Windows.Input.TouchPoint oPos = e.GetTouchPoint(this); Line oLine = new Line(); oLine.Stroke = new SolidColorBrush(Colors.Red); oLine.StrokeThickness = 2; oLine.X1 = oPos.Position.X; oLine.Y1 = oPos.Position.Y; this.ProxyLine = oLine; Console.WriteLine("TouchID " + e.TouchDevice.Id + " TouchDown " + oPos.Position.X + " " + oPos.Position.Y);}
Console Write Result:
效果图如下:
private void SimulateTouch(int x, int y){ // Touch Down Simulate PointerTouchInfo contact = MakePointerTouchInfo(x, y, 5, 1); PointerFlags oFlags = PointerFlags.DOWN | PointerFlags.INRANGE | PointerFlags.INCONTACT; contact.PointerInfo.PointerFlags = oFlags; bool bIsSuccess = TouchInjector.InjectTouchInput(1, new[] { contact }); // Touch Move Simulate int nMoveIntervalX = this.GetRandomSeed().Next(-60, 60); int nMoveIntervalY = this.GetRandomSeed().Next(-60, 60); contact.Move(nMoveIntervalX, nMoveIntervalY); oFlags = PointerFlags.INRANGE | PointerFlags.INCONTACT | PointerFlags.UPDATE; contact.PointerInfo.PointerFlags = oFlags; TouchInjector.InjectTouchInput(1, new[] { contact }); // Touch Up Simulate contact.PointerInfo.PointerFlags = PointerFlags.UP; TouchInjector.InjectTouchInput(1, new[] { contact });}
Source Url:
Multi Touch Also Support Like this:
private void BdrSimulateZm_MouseLeftButtonUp(object sender, MouseButtonEventArgs e){ // Touch Down Simulate int x1 = this.GetRandomSeed().Next(50, 1680 - 100); int y1 = this.GetRandomSeed().Next(50, 1080 - 100); PointerTouchInfo oContact1 = MakePointerTouchInfo(x1, y1, 5, 1); int x2 = this.GetRandomSeed().Next(50, 1680 - 100); int y2 = this.GetRandomSeed().Next(50, 1080 - 100); PointerTouchInfo oContact2 = MakePointerTouchInfo(x2, y2, 5, 1); PointerFlags oFlags = PointerFlags.DOWN | PointerFlags.INRANGE | PointerFlags.INCONTACT; oContact1.PointerInfo.PointerFlags = oFlags; oContact2.PointerInfo.PointerFlags = oFlags; TouchInjector.InjectTouchInput(2, new[] { oContact1, oContact2 }); // Touch Move Simulate int nMoveIntervalX = this.GetRandomSeed().Next(-60, 60); int nMoveIntervalY = this.GetRandomSeed().Next(-60, 60); oContact1.Move(nMoveIntervalX, nMoveIntervalY); oContact2.Move(nMoveIntervalX, nMoveIntervalY); oFlags = PointerFlags.INRANGE | PointerFlags.INCONTACT | PointerFlags.UPDATE; oContact1.PointerInfo.PointerFlags = oFlags; oContact2.PointerInfo.PointerFlags = oFlags; TouchInjector.InjectTouchInput(2, new[] { oContact1 , oContact2 }); // Touch Up Simulate oContact1.PointerInfo.PointerFlags = PointerFlags.UP; oContact2.PointerInfo.PointerFlags = PointerFlags.UP; TouchInjector.InjectTouchInput(2, new[] { oContact1, oContact2 });}