17 Stimmen

WPF: Gibt es eine Möglichkeit, gewöhnliche Maus-Ereignisse zu Touch-Ereignissen in Windows 7 "umzuleiten"?

Ich entwickle derzeit eine Touchscreen-Anwendung mit C# (.NET 4.0) und WPF für Windows 7. Mein Problem ist, dass der Treiber des Touchscreens, den ich im Moment zur Verfügung habe, nur Mausereignisse erzeugt. (Der Hersteller stellt leider keinen echten Windows 7 Treiber zur Verfügung) Daher kann ich derzeit keine Tests richtig durchführen.

Gibt es eine generische Möglichkeit, Windows 7 mitzuteilen, dass ein bestimmtes Gerät ein Touch-Gerät sein soll (obwohl dies - natürlich - nur einzelne Touch-Ereignisse liefern könnte)?

14voto

Rana Punkte 156

Prüfen Sie dies. http://blakenui.codeplex.com/ . Es gibt eine Datei "MouseTouchDevice.cs", die wie folgt aussieht. Sie wandelt normale Mausereignisse in Manipulationsereignisse um.

/// <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
}

}

Ich hoffe, das ist es, wonach Sie suchen.

0voto

Eric Brown Punkte 13486

Dazu müssten Sie den Maustreiber so umschreiben, dass er sich wie ein Touch-Gerät verhält. Eine einfachere Lösung wäre, sich ein Gerät wie das Wacom Bamboo Touch? Das ist ein echtes Touch-Gerät (kein Touchscreen).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X