2015-04-23 11 views
10

यह एक विशिष्ट नियंत्रण के भीतर काम करता है, लेकिन यह विशिष्ट नियंत्रण काम नहीं करता है।डब्ल्यूपीएफ में स्क्रीन पर माउस की स्थिति कैसे प्राप्त करें?

माउस की स्थिति कैसे प्राप्त करें और सीधे माउस से सीधे किसी भी नियंत्रण से माउस ईवेंट का उपयोग कैसे करें (प्लेटफार्म आमंत्रण के बिना)?

2 आवश्यक अंक:

  1. माउस घटनाओं जब माउस एक नियंत्रण में नहीं है, लेकिन एक स्क्रीन पर।
  2. माउस स्थिति जब माउस नियंत्रण में नहीं है, लेकिन स्क्रीन पर।

इसे प्लेटफ़ॉर्म आमंत्रण के बिना हल किया जाना चाहिए।

अगला दो काम नहीं करते:

System.Windows.Input.Mouse.GetPosition(this) 

माउस स्थिति बाहर एक विशिष्ट नियंत्रण नहीं मिल है।

System.Windows.Forms.Cursor.Position.X 

System.Windows.Forms.Cursor.Position काम नहीं करता है, क्योंकि यह एक WPF अनुप्रयोग में कोई प्रकार है, लेकिन यह एक Windows में काम करता है अनुप्रयोग फॉर्म्स।

IntelliSense हो जाता है System.Windows.Forms.Cursor.Position, लेकिन यह स्थिति किसी भी प्रकार नहीं मिलता है, इसलिए मैं नहीं मिल सकता है:

Position.X  
Position.Y 

और

Point pointToWindow = Mouse.GetPosition(this); 

Point pointToScreen = PointToScreen(pointToWindow); 

Doesn एक विशिष्ट नियंत्रण से माउस स्थिति नहीं मिलता है।

उत्तर

9

एक नियंत्रण के MouseDown घटना का उपयोग करते हुए आप इस कोशिश कर सकते हैं:

var point = e.GetPosition(this.YourControl); 

संपादित करें: आप Mouse.Capture(YourControl); का उपयोग कर तो यह माउस की घटनाओं पर कब्जा होगा तो भी यह नहीं है एक विशिष्ट नियंत्रण करने के लिए माउस घटना पर कब्जा कर सकते हैं उस नियंत्रण पर। यहाँ link

+0

यह करता

परियोजना के लिए दो संदर्भ जोड़ें:

यहाँ कोड है नियंत्रण नहीं काम करते हैं। यह समाधान नहीं है। –

+0

आप इसे सभी नियंत्रणों को संलग्न करने वाले मुख्य नियंत्रण के लिए उपयोग कर सकते हैं उदा। 'UserControl' या' विंडो' –

+0

हां, लेकिन मेरे मामले में जब मैं खिड़की से बाहर होता हूं तो मैं खिड़की पर खींचता हूं। मेरा लक्ष्य माउस द्वारा पृष्ठभूमि में एक विंडो पर खींचा जाता है, जब कोई उपयोगकर्ता माउस को कुछ और करता है। यदि यह असंभव है, तो मुझे बताएं। –

8

आप उपयोग कर सकते हैं PointToScreen

एक प्वाइंट कि दृश्य की समन्वय प्रणाली स्क्रीन निर्देशांक में एक प्वाइंट में वर्तमान का प्रतिनिधित्व करता है में कनवर्ट करता है।

कुछ इस तरह:

private void MouseCordinateMethod(object sender, MouseEventArgs e) 
{ 
    var relativePosition = e.GetPosition(this); 
    var point= PointToScreen(relativePosition); 
    _x.HorizontalOffset = point.X; 
    _x.VerticalOffset = point.Y; 
} 

ध्यान दें कि Mouse.GetPosition एक प्वाइंट देता है, और PointToScreen धर्मान्तरित स्क्रीन इंगित समन्वय

संपादित करें:

आप उपयोग कर सकते हैं Mouse.Capture(SepcificControl);MSDN

निर्दिष्ट तत्व में माउस इनपुट कैप्चर करता है।

+0

यह एक विशिष्ट नियंत्रण काम नहीं करता है। मेरे ऐप में कोई विंडो नहीं है, यह माउस द्वारा पृष्ठभूमि पर खींचती है, जबकि उपयोगकर्ता कुछ और करने के लिए माउस का उपयोग करता है। यह सिर्फ माउस चाल की प्रतिलिपि बनाता है। यदि प्लेटफार्म के बिना यह असंभव है, तो मुझे बताएं। प्रश्न का उत्तर नहीं दिया गया है। –

+0

@ZiyaCeferov: - देर से उत्तर के लिए खेद है, लेकिन हाँ आप अपने माउस –

+0

के लिए 'माउस.कैप्चर (विशिष्ट नियंत्रण);' का उपयोग कर सकते हैं, यह बहुत अच्छा काम करता है। हल किए गए दो मुद्दों में से एक, दूसरे के बारे में क्या: स्क्रीन पर सीधे नियंत्रण के बिना माउस ईवेंट का उपयोग कैसे करें? मैं अंतहीन धागे या टाइमर का उपयोग कर इसे हल कर सकता हूं, लेकिन मैं पूछता हूं: क्या हम एक तैयार तरीका है जैसे हम नियंत्रण के साथ करते हैं? –

1

मैं, थोड़ा नया पाया,

कोड से नीचे है, fisrt निर्माण किया है और खिड़की चलाने

तो बस अपने माउस एक बार खिड़की पर पहिया अनंत स्क्रीन माउस का पता लगाने के आह्वान करने के लिए पद।

(इस प्रकार मैं प्रश्न के दूसरे बिंदु में नियंत्रण से बाहर माउस घटना का पता लगाने के लिए रास्ता नहीं मिल रहा था, लेकिन इसी तरह के प्रयोग एक अंतहीन धागा।)

लेकिन मैं सिर्फ सक्षम करने के लिए एक छोटे से कौशल का उपयोग WPF प्रोजेक्ट में Windows.Forms, केवल शुद्ध विधि में फॉर्म कोड का उपयोग करके, उस विधि को इवेंट कोड ब्लॉक में देखें।

System.Drawing 
System.Windows.Forms 

Xaml हिस्सा:

<Window x:Class="Test.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:g="clr-namespace:Gma.UserActivityMonitor;assembly=Gma.UserActivityMonitor" 
     Title="MainWindow" Height="350" Width="525" 
     MouseWheel="MainWindow_OnMouseWheel"> 
    <Grid> 
     <TextBlock Name="TBK" /> 
    </Grid> 
</Window> 

कक्षा कोड:

public partial class MainWindow : Window 
    { 
     public MainWindow() 
     { 
      InitializeComponent(); 
     } 

     public void KeepReportMousePos() 
     { 
      //Endless Report Mouse position 
      Task.Factory.StartNew(() => 
      { 
       while(true){ 
        this.Dispatcher.Invoke(
         DispatcherPriority.SystemIdle, 
         new Action(() => 
         { 
          GetCursorPos(); 
         })); 
       } 
      }); 
     } 
     public void GetCursorPos() 
     { 
      //get the mouse position and show on the TextBlock 
      System.Drawing.Point p = System.Windows.Forms.Cursor.Position; 
      TBK.Text = p.X + " " + p.Y; 
     } 

     private void MainWindow_OnMouseWheel(object sender, MouseWheelEventArgs e) 
     { 
      //invoke mouse position detect when wheel the mouse 
      KeepReportMousePos(); 
     } 
    } 
संबंधित मुद्दे