WPF: есть ли возможность «перенаправлять» обычные события мыши на сенсорные события в Windows 7 - PullRequest
15 голосов
/ 28 июля 2010

В настоящее время я разрабатываю приложение для сенсорного экрана с использованием C # (.NET 4.0) и WPF для Windows 7. Моя проблема в том, что драйвер имеющегося у меня на данный момент сенсорного экрана генерирует только события мыши. (К сожалению, производитель не предоставляет подлинный драйвер для Windows 7) Итак, в настоящее время я не могу правильно выполнять тесты.

Существует ли общий способ сообщить Windows 7, что определенное устройство должно быть сенсорным (хотя это, конечно, может обеспечивать только события одного касания)?

Ответы [ 2 ]

13 голосов
/ 11 января 2011

Проверьте это.http://blakenui.codeplex.com/. Существует файл MouseTouchDevice.cs, который выглядит следующим образом.Он преобразует обычные события мыши в события манипуляции.

/// <summary>
/// Used to translate mouse events into touch events, enabling a unified 
/// input processing pipeline.
/// </summary>
/// <remarks>This class originally comes from Blake.NUI - http://blakenui.codeplex.com</remarks>
public class MouseTouchDevice : TouchDevice, ITouchDevice
{
    #region Class Members

    private static MouseTouchDevice device;

    public Point Position { get; set; }

    #endregion

    #region Public Static Methods

    public static void RegisterEvents(FrameworkElement root)
    {
        root.PreviewMouseDown += MouseDown;
        root.PreviewMouseMove += MouseMove;
        root.PreviewMouseUp += MouseUp;
        root.LostMouseCapture += LostMouseCapture;
        root.MouseLeave += MouseLeave;
    }

    #endregion

    #region Private Static Methods

    private static void MouseDown(object sender, MouseButtonEventArgs e)
    {
        if (device != null &&
            device.IsActive)
        {
            device.ReportUp();
            device.Deactivate();
            device = null;
        }
        device = new MouseTouchDevice(e.MouseDevice.GetHashCode());
        device.SetActiveSource(e.MouseDevice.ActiveSource);
        device.Position = e.GetPosition(null);
        device.Activate();
        device.ReportDown();
    }

    private static void MouseMove(object sender, MouseEventArgs e)
    {
        if (device != null &&
            device.IsActive)
        {
            device.Position = e.GetPosition(null);
            device.ReportMove();
        }
    }

    private static void MouseUp(object sender, MouseButtonEventArgs e)
    {
        LostMouseCapture(sender, e);
    }

    static void LostMouseCapture(object sender, MouseEventArgs e)
    {
        if (device != null &&
            device.IsActive)
        {
            device.Position = e.GetPosition(null);
            device.ReportUp();
            device.Deactivate();
            device = null;
        }
    }

    static void MouseLeave(object sender, MouseEventArgs e)
    {
        LostMouseCapture(sender, e);
    }

    #endregion

    #region Constructors

    public MouseTouchDevice(int deviceId) :
        base(deviceId)
    {
        Position = new Point();
    }

    #endregion

    #region Overridden methods

    public override TouchPointCollection GetIntermediateTouchPoints(IInputElement relativeTo)
    {
        return new TouchPointCollection();
    }

    public override TouchPoint GetTouchPoint(IInputElement relativeTo)
    {
        Point point = Position;
        if (relativeTo != null)
        {
            point = this.ActiveSource.RootVisual.TransformToDescendant((Visual)relativeTo).Transform(Position);
        }

        Rect rect = new Rect(point, new Size(1, 1));

        return new TouchPoint(this, point, rect, TouchAction.Move);
    }

    #endregion
}

}

Я надеюсь, что это то, что вы ищете.

0 голосов
/ 29 июля 2010

Для этого вам нужно переписать драйвер мыши, чтобы он действовал как сенсорное устройство. Более простым решением было бы получить устройство, подобное Wacom Bamboo Touch? Это настоящее сенсорное устройство (не сенсорный экран).

...