/// <summary> /// Handles timer event /// </summary> /// <param name="sender">Sender</param> /// <param name="e">Args</param> private void OnTimer(object sender, ElapsedEventArgs e) { _gesture = _gesture == InputGestureEnum.None && !System.Windows.Forms.Cursor.Position.Equals(_previousPosition) ? InputGestureEnum.Position : _gesture; _previousPosition = System.Windows.Forms.Cursor.Position; ScreenInputEvent?.Invoke( this, new ScreenInputEventArg( System.Windows.Forms.Cursor.Position.X, System.Windows.Forms.Cursor.Position.Y, _gesture)); _gesture = InputGestureEnum.None; _timer.Start(); }
/// <summary> /// Handles timer event /// </summary> /// <param name="sender">Sender</param> /// <param name="e">Args</param> private void OnTimer(object sender, ElapsedEventArgs e) { try { Frame frame = _controller.Frame(); Hand currentHand = GetRightHand(frame); Vector tip = GetHandTip(currentHand); // Get reference frame get first time with a righthand if (_referenceFrame == null && currentHand != null) { _referenceFrame = frame; } else if (_referenceFrame != null && currentHand == null) { // Remove reference frame if no hand is detected _referenceFrame = null; } // Compute gesture float rotation = 0; if (_referenceFrame != null && currentHand != null) { rotation = currentHand.RotationAngle(_referenceFrame, Vector.ZAxis); } int screenX = _settingsManager.Settings.ScreenX.Value; int screenY = _settingsManager.Settings.ScreenY.Value; int screenH = _settingsManager.Settings.ScreenHeight.Value; int delayBetweenActions = _settingsManager.Settings.DelayBetweenActions.Value; double xPos = tip == null ? 0f : tip.x * screenX / 180f + screenY; double yPos = tip == null ? 0f : screenH - tip.y * 4f; if (frame.Hands.Count == 2) { _gesture = DateTime.Now.Subtract(_lastClick).TotalMilliseconds > delayBetweenActions ? InputGestureEnum.Exit : InputGestureEnum.None; } else if (_referenceFrame != null && Math.Abs(rotation) > Math.PI / 3) { _gesture = rotation > 0 ? InputGestureEnum.RollIn : InputGestureEnum.Rollout; } else if (tip != null) { _gesture = tip.z <0 && DateTime.Now.Subtract(_lastClick).TotalMilliseconds> delayBetweenActions ? InputGestureEnum.Click : InputGestureEnum.Position; } else { _gesture = InputGestureEnum.None; } if (_gesture == InputGestureEnum.Click || _gesture == InputGestureEnum.Exit) { _lastClick = DateTime.Now; } // Notify gesture ScreenInputEvent?.Invoke(this, new ScreenInputEventArg(xPos, yPos, _gesture)); } catch (Exception ex) { LogManager.LogLine(ex.Message); } _timer.Start(); }