且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

WPF- 模拟触发Touch Events

更新时间:2022-09-18 13:27:02

原文:WPF- 模拟触发Touch Events

基于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:

WPF- 模拟触发Touch Events

  效果图如下:

WPF- 模拟触发Touch Events

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:https://github.com/DuelCode/TouchSimulate

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