2010-07-28 12 views
13

Actualmente estoy desarrollando una aplicación de pantalla táctil usando C# (.NET 4.0) y WPF para Windows 7. Mi problema es que la El controlador de la pantalla táctil que tengo disponible en este momento solo genera eventos de mouse. (El fabricante desafortunadamente no proporciona un controlador genuino de Windows 7) Por lo tanto, actualmente no puedo hacer las pruebas correctamente.WPF: existe la posibilidad de "enrutar" eventos de mouse normales para tocar eventos en Windows 7

¿Existe una manera genérica de decirle a Windows 7 que se supone que un dispositivo determinado es un dispositivo táctil (aunque esto, por supuesto, solo podría proporcionar eventos de un solo toque)?

Respuesta

12

Mira esto. http://blakenui.codeplex.com/. Hay un archivo MouseTouchDevice.cs que se ve así. Convierte eventos de ratón normales a eventos de Manipulación.

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

}

Espero que esto es lo que busca.

+0

Exactamente lo que iba a publicar, ¡excepto que me pegaste al golpe! Bien hecho :) – Hugo

+0

¿Qué pasa si no tengo MouseButtonEventArgs? ¿Cómo generaría los eventos táctiles? Consulte mi pregunta aquí: http://stackoverflow.com/questions/9716439/wpf-how-to-synthesize-a-touch-event-from-scratch – simo

+0

Si no desea desencadenar Touch mouse mouse events dos veces. Utilice este si (e.StylusDevice! = Null) return; – Andreas

0

Debería volver a escribir el controlador del mouse para que funcione como un dispositivo táctil para hacer esto. Una solución más simple sería obtener un dispositivo como el Wacom Bamboo Touch? Es un dispositivo táctil real (no una pantalla táctil).

+0

¿Está bien, entonces no existe un controlador intermedio entre los mouse que se pueda configurar para producir eventos mouse o touch? (Puede "alguien" escribir uno :)) La idea con una tableta Wacom no es mala, por lo que puede llevar el dispositivo a diferentes PC. – Seven

+0

Es ciertamente posible escribir un controlador de filtro que envuelva el controlador del mouse y lo convierta en datos táctiles. Sin embargo, no es trivial hacerlo. (No lo haría, pero si tienes un desarrollador talentoso que ya ha escrito un par de controladores, ¡adelante!) Sin duda, el dispositivo táctil será más económico. :) –

Cuestiones relacionadas