2013-03-25 7 views
7

मैं कर्सर को स्थानांतरित करने के लिए इस फ़ंक्शन का उपयोग कर रहा हूं।सी # विश्वसनीय माउसमोव (हॉप)

[DllImport("user32.dll")] 
static extern bool SetCursorPos(int X, int Y); 

जब मैं एक हॉटकी का उपयोग यह गति प्रदान करने, कर्सर सही coords में चले जाएंगे और अगली बार मैं माउस से वह उस स्थान से जारी है चाल। इरादे के रूप में काम करना।

हालांकि मुझे MouseMove ईवेंट के दौरान SetCursorPos को ट्रिगर करने की आवश्यकता है। यदि उपयोगकर्ता माउस को किसी निश्चित क्षेत्र में ले जाता है तो मैं चाहता हूं कि यह एक अलग जगह पर आ जाए और वहां से आगे बढ़े। लेकिन अभी यह गंतव्य पर जाता है और फिर तुरंत वापस आ जाता है (समय का 9 0%)। मैं उस व्यवहार से कैसे बच सकता हूं?

संपादित करें: मैंने 1 mousemove ईवेंट के लिए कर्सर को 1 से 1 पीएक्स वर्ग में क्लिप करके इसे चारों ओर काम करने का निर्णय लिया। कर्सर। क्लिप (माउसपोजिशन, नया आयताकार (1, 1));

+4

कृपया अपना माउसमोव ईवेंट हैंडलर कोड पोस्ट करें। –

+0

मैं सचमुच बस उस समारोह को बुला रहा हूं और MouseMove ईवेंट में कुछ भी नहीं। – user1340531

+0

@ user1340531: इसे वैसे भी पोस्ट करें? – mpen

उत्तर

1

मेरा अनुमान है कि उस क्षेत्र में आपके फॉर्म के शीर्ष पर एक और नियंत्रण है जहां आप ईवेंट को ट्रिगर करना चाहते हैं। यदि ऐसा है, तो नियंत्रण MouseMove ईवेंट कैप्चर कर रहा है।

उदाहरण के लिए, यहां मैंने ऊपरी बाएं कोने में स्थिति 0, 0 पर एक हरा 200x200 पैनल जोड़ा है। यदि माउस पैनल पर चलता है, तो फॉर्म का MouseMove ईवेंट माउस कर्सर स्थिति को कैप्चर करना बंद कर देगा। मेरे फॉर्म के mouse_move ईवेंट में, मैंने माउस निर्देशांक प्रदर्शित करने के लिए फ़ॉर्म का टेक्स्ट सेट किया है। ध्यान दें कि विंडो टेक्स्ट में निर्देशांक अभी भी 200 हैं, 200 जब माउस वास्तव में 0 पर था, 0 (स्क्रीनशॉट प्राप्त करने के लिए SnippingTool.exe पर क्लिक करने के कारण मेरा कर्सर नहीं देख सकता)।

enter image description here

इसे ठीक करने के लिए एक ही कोड आप पैनल की MouseMove घटना में अपने फ़ॉर्म के MouseMove घटना में रखा (या जो भी आप उपयोग कर रहे पर नियंत्रण) का उपयोग करें। इसके परिणामस्वरूप फ़ॉर्म के पाठ में सही निर्देशांक होते हैं।

enter image description here

और यहाँ है कोड (यह स्पष्ट रूप से एक भी विधि में पुनर्संशोधित किया जा सकता है):

public partial class Form1 : Form 
{ 
    [DllImport("user32.dll")] 
    static extern bool SetCursorPos(int X, int Y); 

    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void Form1_MouseMove(object sender, MouseEventArgs e) 
    { 
     this.Text = string.Format("X: {0}, Y: {1}", e.X, e.Y); 

     if (e.X >= 0 && e.X <= 200) 
     { 
      if (e.Y >= 0 && e.Y <= 200) 
      { 
       SetCursorPos(500, 500); 
      } 
     } 
    } 

    private void panel1_MouseMove(object sender, MouseEventArgs e) 
    { 
     this.Text = string.Format("X: {0}, Y: {1}", e.X, e.Y); 

     if (e.X >= 0 && e.X <= 200) 
     { 
      if (e.Y >= 0 && e.Y <= 200) 
      { 
       SetCursorPos(500, 500); 
      } 
     } 
    } 
} 
+0

मेरा माउसमोव इवेंट वास्तव में वैश्विक है, इससे कोई फर्क नहीं पड़ता कि मैं क्या कर रहा हूं, जब तक कि कर्सर चलता है। – user1340531

+2

@ user1340531 जैसा कि अन्य टिप्पणीकारों ने कहा है, आपको उस कोड को अपने प्रश्न में जोड़ना होगा। – Inisheer

+1

मुख्य रूप से क्योंकि "वैश्विक" MouseMove ईवेंट जैसी कोई चीज़ नहीं है, जब तक कि आपने वैश्विक हुक स्थापित नहीं किया हो। –

0

इस तरह के छोटे से सूचना (शायद आपके GUI का एक स्क्रीनशॉट में मदद मिलेगी) के साथ कहने के लिए मुश्किल । आप कोशिश कर सकते हैं:

private void Button_MouseMove_1(object sender, MouseEventArgs e) 
    { 
     SetCursorPos(0, 0); 
     e.Handled = true; 
    } 
संबंधित मुद्दे