WPF- 模拟触发Touch Events

Posted lonelyxmas

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了WPF- 模拟触发Touch Events相关的知识,希望对你有一定的参考价值。

原文: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:

技术分享图片

? 效果图如下:

技术分享图片

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

?

以上是关于WPF- 模拟触发Touch Events的主要内容,如果未能解决你的问题,请参考以下文章

移动端一些小问题

jquery的touch函数怎么用

使用图片touch事件模拟按钮点击效果&&图片预加载

使用原生代码实现一个Events模块,可以实现自定义事件的订阅触发移除功能

SoundCloud SC.Widget.Events.FINISH 不再触发 HTML5 小部件

详解css3 pointer-events(阻止hoveractiveonclick等触发事件来