Обработка событий касания и жеста

Я работаю над графическим интерфейсом, который включает ввод жестов с емкостной сенсорной панели, подключенной к машине с Windows 7. В ОС установлены драйверы для поддержки планшетных ПК, и они должны быть единственным средством связи.

Мой основной подход заключается в использовании класса InkCollector, на который ссылается Microsoft.ink.dll. Это дает мне доступ к событиям SystemGesture, которые достаточны для реализации поведения, которое я ищу.

Теперь проблема в том, что событие SystemGesture.Flick наступает очень медленно, примерно через целую секунду. Я понимаю, что происходит обработка для распознавания Flick, но она все еще делает идею непригодной для использования.

Есть идеи, как ускорить процесс?

Мой код инициализации ниже:

  public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            InkCollector inkCollector = new InkCollector(this);
            inkCollector.CollectionMode = CollectionMode.GestureOnly;
            inkCollector.Enabled = true;

            inkCollector.SetGestureStatus(ApplicationGesture.AllGestures, true);

            inkCollector.SystemGesture += SystemGestureEventHandler;
            inkCollector.Gesture += GestureEventHandler;
        }

        public void SystemGestureEventHandler(object o, InkCollectorSystemGestureEventArgs args)
        {
            switch (args.Id)
            {
                case SystemGesture.Drag:
                    outputText.AppendText("Drag" + Environment.NewLine);
                    break;
                case SystemGesture.DoubleTap:
                    outputText.AppendText("DoubleTap"+ Environment.NewLine);
                    break;
                case SystemGesture.Flick:
                    outputText.AppendText("Flick"+ Environment.NewLine);
                    break;
                case SystemGesture.HoldEnter:
                    outputText.AppendText("HoldEnter"+ Environment.NewLine);
                    break;
                case SystemGesture.HoldLeave:
                    outputText.AppendText("HoldLeave" + Environment.NewLine);
                    break;
                case SystemGesture.Tap:
                    outputText.AppendText("Tap"+ Environment.NewLine);
                    break;
                default:
                        break;
            }
        }

    public void GestureEventHandler(object o, InkCollectorGestureEventArgs args)
        {
            foreach (Gesture gesture in args.Gestures)
            {
                switch (gesture.Id)
                {
                    case ApplicationGesture.ArrowDown:
                        outputText.AppendText("Gesture: Arrow Down"+ Environment.NewLine);
                        break;
                    case ApplicationGesture.ArrowUp:
                        outputText.AppendText("Gesture: Arrow Up" + Environment.NewLine);
                        break;
                    case ApplicationGesture.Down:
                        outputText.AppendText("Gesture: Down" + Environment.NewLine);
                        break;
                    case ApplicationGesture.Up:
                        outputText.AppendText("Gesture: Up" + Environment.NewLine);
                        break;
                    default:
                        break;
                }
            }

1 ответ

Решение

После некоторых раскопок я обнаружил, что задержка была на самом деле преднамеренной и служила тайм-аутом для распознавания и завершения жеста. К сожалению, этот тайм-аут не может быть изменен (см.: https://msdn.microsoft.com/en-us/library/ms827533.aspx).

Мне пришлось изменить режим сбора чернил на:

inkCollector.CollectionMode = CollectionMode.InkAndGesture;

и отключить рендеринг чернил на элемент управления:

inkCollector.DynamicRendering = false;
Другие вопросы по тегам