2010-07-28 13 views
13

Attualmente sto sviluppando un'applicazione touchscreen utilizzando C# (.NET 4.0) e WPF per Windows 7. Il mio problema è che il driver del touch screen che ho a disposizione al momento genera solo eventi del mouse. (Il produttore purtroppo non fornisce un vero driver per Windows 7) Quindi, attualmente non sono in grado di eseguire correttamente i test.WPF: Esiste la possibilità di "instradare" gli eventi del mouse ordinario per toccare gli eventi in Windows 7

C'è un modo generico per indicare a Windows 7 che un determinato dispositivo dovrebbe essere un dispositivo touch (sebbene questo, ovviamente, potrebbe fornire solo eventi a tocco singolo)?

risposta

12

Controllare questo. http://blakenui.codeplex.com/. C'è un file MouseTouchDevice.cs che assomiglia a questo. Converte gli eventi normali del mouse in eventi di manipolazione.

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

}

spero questo è quello che stai cercando.

+0

Esattamente quello che stavo per pubblicare, tranne che mi hai battuto al punch! Ben fatto :) – Hugo

+0

Cosa succede se non ho MouseButtonEventArgs ?? Come posso generare gli eventi tattili? si prega di vedere la mia domanda qui: http://stackoverflow.com/questions/9716439/wpf-how-to-synthesize-a-touch-event-from-scratch – simo

+0

Se non si vuole sparare tocco promosso eventi del mouse due volte. Utilizzare questo se return (e.StylusDevice! = Null); – Andreas

0

È necessario riscrivere il driver del mouse per agire come un dispositivo touch. Una soluzione più semplice sarebbe quella di ottenere un dispositivo come il Wacom Bamboo Touch? È un vero dispositivo touch (non un touch screen).

+0

OK, quindi non c'è alcuna cosa come un in-tra-topo-pilota, che può essere configurato per produrre eventi mouse o touch? (Forse "qualcuno" dovrebbe scriverne uno :)) L'idea con un tablet Wacom non è male, quindi è possibile portare il dispositivo su diversi PC. – Seven

+0

È certamente _possibile_ scrivere un driver di filtro che avvolge il driver del mouse e lo converte in dati touch. Non è banale farlo, però. (Io non lo farei, ma se si dispone di uno sviluppatore di talento che ha già scritto un paio di piloti, quindi andare per esso!) Certo, il dispositivo touch sarà più conveniente. :) –

Problemi correlati