2010-11-19 18 views
47

स्क्रीन पर वर्तमान माउस समन्वय कैसे प्राप्त करें? मुझे केवल Mouse.GetPosition() पता है जो तत्व का माउसपोजिशन प्राप्त करते हैं, लेकिन मैं तत्व का उपयोग किए बिना समन्वय प्राप्त करना चाहता हूं।मैं WPF में वर्तमान माउस स्क्रीन निर्देशांक कैसे प्राप्त करूं?

+0

माउस के साथ समन्वय क्या है? खिड़की के सापेक्ष स्क्रीन समन्वय? –

+2

मेरा मतलब स्क्रीन पर माउस की स्थिति है। –

उत्तर

52

रेचेल के जवाब पर अनुवर्ती कार्रवाई करने के लिए।
यहां दो तरीके हैं जिनमें आप WPF में माउस स्क्रीन समन्वय प्राप्त कर सकते हैं।

1. विंडोज फॉर्म का उपयोग करना। System.Windows.Forms

के लिए एक संदर्भ जोड़ें
public static Point GetMousePositionWindowsForms() 
{ 
    System.Drawing.Point point = Control.MousePosition; 
    return new Point(point.X, point.Y); 
} 

2.Using Win32

[DllImport("user32.dll")] 
[return: MarshalAs(UnmanagedType.Bool)] 
internal static extern bool GetCursorPos(ref Win32Point pt); 

[StructLayout(LayoutKind.Sequential)] 
internal struct Win32Point 
{ 
    public Int32 X; 
    public Int32 Y; 
}; 
public static Point GetMousePosition() 
{ 
    Win32Point w32Mouse = new Win32Point(); 
    GetCursorPos(ref w32Mouse); 
    return new Point(w32Mouse.X, w32Mouse.Y); 
} 
+1

सही होने पर, यदि आप कच्चे एक्स और वाई निर्देशांक लेते हैं और उनका उपयोग करके विंडो का स्थान सेट करते हैं, तो यह आपकी डीपीआई सेटिंग्स कुछ भी नहीं होने पर ठीक से काम नहीं करेगा लेकिन 100% (96dpi)। प्रश्न का अंतिम उत्तर यह सही है! – user195275

+0

आपकी टिप्पणी पूरी तरह से सच है और इसे इस प्रश्न के सही उत्तर के रूप में चिह्नित नहीं किया जाना चाहिए! – Arash

21

क्या आप स्क्रीन या एप्लिकेशन से संबंधित निर्देशांक चाहते हैं?

यदि यह आवेदन के भीतर बस का उपयोग करें:

Mouse.GetPosition(Application.Current.MainWindow); 

यदि नहीं, तो मेरा मानना ​​है कि आप System.Windows.Forms और उपयोग के लिए एक संदर्भ जोड़ सकते हैं:

System.Windows.Forms.Control.MousePosition; 
+0

यह सिस्टम होना चाहिए। Windows.Forms.Control.MousePosition –

50

या शुद्ध WPF में PointToScreen का उपयोग करें।

+2

यह। अच्छा और साफ। –

+0

"एक बिंदु को परिवर्तित करता है जो स्क्रीन निर्देशांक में एक बिंदु में दृश्य की वर्तमान समन्वय प्रणाली का प्रतिनिधित्व करता है।" माउस की स्थिति के साथ इसका क्या संबंध है? –

+13

माउस। गेटपोजिशन एक प्वाइंट देता है, और प्वाइंट टॉस्क्रीन बिंदु को स्क्रीन समन्वय में परिवर्तित करता है। – erikH

12

यदि आप विभिन्न संकल्पों पर कई उत्तरों का प्रयास करते हैं, तो एकाधिक मॉनीटर वाले कंप्यूटर आदि। आप पाते हैं कि वे विश्वसनीय रूप से काम नहीं करते हैं। ऐसा इसलिए है क्योंकि आपको वर्तमान स्क्रीन से संबंधित माउस स्थिति प्राप्त करने के लिए एक ट्रांसफॉर्म का उपयोग करने की आवश्यकता है, न कि पूरे देखने वाले क्षेत्र में जो आपके सभी मॉनीटर होते हैं। ऐसा कुछ ... (जहां "यह" एक WPF विंडो है)।

var transform = PresentationSource.FromVisual(this).CompositionTarget.TransformFromDevice; 
var mouse = transform.Transform(GetMousePosition()); 

public System.Windows.Point GetMousePosition() 
{ 
    System.Drawing.Point point = System.Windows.Forms.Control.MousePosition; 
    return new System.Windows.Point(point.X, point.Y); 
} 
+1

ग्रेट धन्यवाद! मुझे उच्च संकल्प स्क्रीन के साथ समस्याएं थीं और परिवर्तन आश्चर्यजनक रूप से काम कर रहा है। – mdiehl13

+0

@ mdiehl13 कोई चिंता नहीं :) खुशी है कि आपने मेरे ट्रांसफॉर्म को काम पर ठीक पाया – Alexandru

+0

@ mdiehl13 स्पष्ट रूप से, बहुत से लोग केवल बेस केस का परीक्षण करते हैं। विभिन्न संकल्पों और इस तरह के परीक्षण के लिए +1। :) – Alexandru

1

यह रूपों का उपयोग या किसी DLLs आयात करने के लिए बिना काम करता है:

using System.Windows; 
    using System.Windows.Input; 

    /// <summary> 
    /// Gets the current mouse position on screen 
    /// </summary> 
    private Point GetMousePosition() 
    { 
     // Position of the mouse relative to the window 
     var position = Mouse.GetPosition(Window); 

     // Add the window position 
     return new Point(position.X + Window.Left, position.Y + Window.Top); 
    } 
0

आप परिचालन प्रणाली से कर्सर की स्थिति को पकड़ने के लिए TimerDispatcher (WPF टाइमर अनुरूप) और Windows "हुक" के संयोजन का उपयोग कर सकते हैं।

[DllImport("user32.dll")] 
    [return: MarshalAs(UnmanagedType.Bool)] 
    public static extern bool GetCursorPos(out POINT pPoint); 

प्वाइंट एक प्रकाश struct है। इसमें केवल एक्स, वाई फ़ील्ड हैं।

public MainWindow() 
    { 
     InitializeComponent(); 

     DispatcherTimer dt = new System.Windows.Threading.DispatcherTimer(); 
     dt.Tick += new EventHandler(timer_tick); 
     dt.Interval = new TimeSpan(0,0,0,0, 50); 
     dt.Start(); 
    } 

    private void timer_tick(object sender, EventArgs e) 
    { 
     POINT pnt; 
     GetCursorPos(out pnt); 
     current_x_box.Text = (pnt.X).ToString(); 
     current_y_box.Text = (pnt.Y).ToString(); 
    } 

    public struct POINT 
    { 
     public int X; 
     public int Y; 

     public POINT(int x, int y) 
     { 
      this.X = x; 
      this.Y = y; 
     } 
    } 

यह समाधान भी अक्सर या बहुत कम पैरामीटर पढ़ने के साथ समस्या का समाधान कर रहा है ताकि आप इसे स्वयं समायोजित कर सकें। लेकिन एक तर्क के साथ डब्ल्यूपीएफ विधि अधिभार के बारे में याद रखें जो ticksmilliseconds का प्रतिनिधित्व नहीं कर रहा है।

TimeSpan(50); //ticks 
संबंधित मुद्दे