2010-07-28 13 views
13

में घटनाओं को छूने के लिए सामान्य माउस घटनाओं को "रूट" करने की संभावना है। मैं वर्तमान में विंडोज 7 के लिए सी # (.NET 4.0) और WPF का उपयोग कर टच स्क्रीन एप्लिकेशन विकसित कर रहा हूं। मेरी समस्या यह है कि इस समय उपलब्ध टच स्क्रीन का चालक केवल माउस ईवेंट उत्पन्न करता है। (निर्माता दुर्भाग्यवश एक वास्तविक विंडोज 7 ड्राइवर प्रदान नहीं करता है) तो, वर्तमान में मैं परीक्षण ठीक से करने में सक्षम नहीं हूं।डब्ल्यूपीएफ: क्या विंडोज 7

क्या विंडोज 7 को बताने का एक सामान्य तरीका है कि एक निश्चित डिवाइस को टच डिवाइस माना जाता है (हालांकि यह - निश्चित रूप से - केवल एक स्पर्श ईवेंट प्रदान कर सकता है)?

उत्तर

12

इसे जांचें। 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

बिल्कुल जो मैं पोस्ट करने जा रहा था, सिवाय इसके कि आप मुझे पंच पर हराया! ठीक है :) – Hugo

+0

क्या होगा यदि मेरे पास कोई माउसबटन EventArgs नहीं है ?? मैं टच इवेंट कैसे उत्पन्न करूं? कृपया मेरा प्रश्न यहां देखें: http://stackoverflow.com/questions/9716439/wpf-how-to-synthesize-a-touch-event-from-scratch – simo

+0

यदि आप दो बार प्रचारित माउस ईवेंट को टच नहीं करना चाहते हैं। अगर इसका उपयोग करें (e.StylusDevice! = Null) वापसी; – Andreas

0

ऐसा करने के लिए आपको टच डिवाइस की तरह कार्य करने के लिए माउस ड्राइवर को फिर से लिखना होगा। वाकॉम बांस टच जैसे डिवाइस को प्राप्त करने के लिए एक आसान कामकाज होगा? यह एक असली टच डिवाइस है (टच स्क्रीन नहीं)।

+0

ठीक है, तो माउस-ड्राइवर या टच इवेंट बनाने के लिए कॉन्फ़िगर किया जा सकता है, जिसमें माउस-ड्राइवर के बीच कोई ऐसी चीज नहीं है? (मई "किसी को" लिखना चाहिए :)) वाकॉम टैबलेट वाला विचार खराब नहीं है, इसलिए आप डिवाइस को विभिन्न पीसी के साथ ले जा सकते हैं। – Seven

+0

यह निश्चित रूप से _possible_ फ़िल्टर ड्राइवर लिखने के लिए है जो माउस ड्राइवर को लपेटता है और इसे डेटा स्पर्श करने के लिए परिवर्तित करता है। ऐसा करने के लिए यह तुच्छ नहीं है, यद्यपि। (मैं यह नहीं करूँगा, लेकिन अगर आपके पास एक प्रतिभाशाली डेवलपर है जो पहले से ही कुछ ड्राइवर लिख चुका है, तो इसके लिए जाओ!) निश्चित रूप से टच डिवाइस सस्ता हो जाएगा। :) –