zoukankan      html  css  js  c++  java
  • wpf 触摸命令 注入(模拟触屏操作)

    使用TCD.System.TouchInjection.dll

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading;
    using System.Threading.Tasks;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Data;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Imaging;
    using System.Windows.Navigation;
    using System.Windows.Shapes;
    using TCD.System.TouchInjection;
    
    namespace WpfApp1
    {
        /// <summary>
        /// MainWindow.xaml 的交互逻辑
        /// </summary>
        public partial class MainWindow : Window
        {
            public MainWindow()
            {
                InitializeComponent();
                TouchInjector.InitializeTouchInjection();
            }
            StringBuilder data = new StringBuilder();
            private void Image_TouchDown(object sender, TouchEventArgs e)
            {
                var pos = e.GetTouchPoint(this);
                var screenPos = PointToScreen(new Point(pos.Position.X, pos.Position.Y));
    
                var x = (int)screenPos.X;
                var y = (int)screenPos.Y;
    
                data.Append(e.TouchDevice.Id + ",down," + x + "," + y + ";");
    
    
    
            }
    
            private void Image_TouchUp(object sender, TouchEventArgs e)
            {
                var pos = e.GetTouchPoint(this);
                var screenPos = PointToScreen(new Point(pos.Position.X, pos.Position.Y));
    
                var x = (int)screenPos.X;
                var y = (int)screenPos.Y;
                data.Append(e.TouchDevice.Id + ",up," + x + "," + y + ";");
            }
    
    
    
            private async void redo_Click(object sender, RoutedEventArgs e)
            {
                //求出起点,终点
                var dataStr = data.ToString();
                var list = dataStr.Split(';');
                List<Tuple<int, string, int, int>> structedList = new List<Tuple<int, string, int, int>>();
                foreach (var item in list)
                {
                    var info = item.Split(',');
                    if (info.Length < 3)
                    {
                        continue;
                    }
                    var id = int.Parse(info[0]);
                    var type = info[1];
                    var x = int.Parse(info[2]);
                    var y = int.Parse(info[3]);
    
                    structedList.Add(Tuple.Create(id, type, x, y));
                }
    
                List<Tuple<int, int, int, int>> device = new List<Tuple<int, int, int, int>>();
    
                if (structedList.Count > 1)
                {
                    var idGroup = structedList.GroupBy(x => x.Item1);
                    foreach (var item in idGroup)
                    {
                        int fromX = 0, fromY = 0, toX = 0, toY = 0;
                        foreach (var child in item)
                        {
    
                            if (child.Item2 == "down")
                            {
                                fromX = child.Item3;
                                fromY = child.Item4;
                            }
                            if (child.Item2 == "up")
                            {
                                toX = child.Item3;
                                toY = child.Item4;
                            }
    
                        }
                        device.Add(Tuple.Create(fromX, fromY, toX, toY));
                    }
                  
                    if (device.Count > 1)
                    {
                        Task.Factory.StartNew(() => {
        SimulatePinch(device[0].Item1, device[0].Item2, device[0].Item3, device[0].Item4, device[1].Item1, device[1].Item2, device[1].Item3, device[1].Item4);
    
                        });
                     
                    }
    
                } 
            }
    
    
    
            private async Task SimulatePinch(int fromX, int fromY, int toX, int toY, int fromX2, int fromY2, int toX2, int toY2)
            {
              //  await Task.Delay(2000);//wait for two seconds, so the user can switch windows
                //
                PointerTouchInfo[] contacts = new PointerTouchInfo[2];
                contacts[0] = MakePointerTouchInfo(fromX, fromY, 2, 1);
                contacts[1] = MakePointerTouchInfo(fromX2, fromY2, 2, 2);
    
                bool success = TouchInjector.InjectTouchInput(2, contacts);
                Thread.Sleep(2);
                contacts[0].PointerInfo.PointerFlags = PointerFlags.UPDATE | PointerFlags.INRANGE | PointerFlags.INCONTACT;
                contacts[1].PointerInfo.PointerFlags = PointerFlags.UPDATE | PointerFlags.INRANGE | PointerFlags.INCONTACT;
    
                //drag them from/to each other
                for (int i = 0; i < 100; i++)
                {
                    contacts[0].Move((toX - fromX) / 100, (toY - fromY) / 100);
                    contacts[1].Move((toX2 - fromX2) / 100, (toY2 - fromY2) / 100);
    
                    bool s = TouchInjector.InjectTouchInput(2, contacts);
                    Thread.Sleep(2);
                }
    
                //release them
                contacts[0].PointerInfo.PointerFlags = PointerFlags.UP;
                contacts[1].PointerInfo.PointerFlags = PointerFlags.UP;
    
                bool success2 = TouchInjector.InjectTouchInput(2, contacts);
            }
    
            private PointerTouchInfo MakePointerTouchInfo(int x, int y, int radius, uint id, uint orientation = 90, uint pressure = 32000)
            {
                PointerTouchInfo contact = new PointerTouchInfo();
                contact.PointerInfo.pointerType = PointerInputType.TOUCH;
                contact.TouchFlags = TouchFlags.NONE;
                contact.Orientation = orientation;
                contact.Pressure = pressure;
                contact.PointerInfo.PointerFlags = PointerFlags.DOWN | PointerFlags.INRANGE | PointerFlags.INCONTACT;
                contact.TouchMasks = TouchMask.CONTACTAREA | TouchMask.ORIENTATION | TouchMask.PRESSURE;
                contact.PointerInfo.PtPixelLocation.X = x;
                contact.PointerInfo.PtPixelLocation.Y = y;
                contact.PointerInfo.PointerId = id;
                contact.ContactArea.left = x - radius;
                contact.ContactArea.right = x + radius;
                contact.ContactArea.top = y - radius;
                contact.ContactArea.bottom = y + radius;
                return contact;
            }
        }
    }
  • 相关阅读:
    [翻译] SVProgressHUD
    使用CoreData [4]
    Android学习笔记之AndroidManifest.xml文件解析
    Android 版本自动更新
    两个android程序间的相互调用(apk互调)
    Android 生成含签名文件的apk安装包
    【已解决】Android ADT中增大AVD内存后无法启动:emulator failed to allocate memory 8
    android adt与android sdk有什么关系,他们在开发中各起到什么作用
    Please ensure that adb is correctly located at……问题解决方案
    安装Android SDK时,点击SDK Manager.exe闪退,并且jdk的环境变量是对的。
  • 原文地址:https://www.cnblogs.com/congqiandehoulai/p/12726084.html
Copyright © 2011-2022 走看看