2012-12-28 8 views
5

मैं एक छोटी उपयोगिता लिखने की कोशिश कर रहा हूं जो मेरी स्क्रीन को पूरी स्क्रीन पर कहां जा सकता है की सीमाओं को संशोधित करेगा। मैंने वैश्विक माउस हुक लाइब्रेरी का उपयोग किया है जिसे मैंने here (मैं संस्करण 1 का उपयोग कर रहा हूं) पाया है, और उसके बाद माउस स्थिति की जानकारी को अपने स्वयं के फ़ंक्शन में उत्पन्न करता है (केवल यह देखने के लिए कि यह अभी काम कर रहा है) ।माउस स्थिति सेट नहीं कर रहा है C#

internal void ProcessMouseEvent(System.Drawing.Point point) 
{ 
    Cursor.Position = new Point(50,50); 
} 

जब यह चल रहा है, माउस निर्दिष्ट बात करने के लिए फ्लैश करने के लिए प्रकट होता है, लेकिन तुरंत वापस जहां यह परिवर्तन से पहले था अगर यह एक आंदोलन घटना थी पर लौट जाएगा। केवल तभी जब यह एक क्लिक घटना के माध्यम से किया गया था, यह वास्तव में नई स्थिति में रहता है।

उत्तर

3

माउस को कुशलतापूर्वक कहां जा सकता है, इसे सीमित करने के लिए, आपको कर्सर.क्लिप का उपयोग करने की आवश्यकता है। आप इसके प्रलेखन here पा सकते हैं। यह वही करेगा जो आप अधिक आसान चाहते हैं और अनुशंसित तरीका है।

+0

क्या होगा यदि मेरी सीमाएं आयताकार नहीं हैं? – littlerat

+0

@littlerat आपके प्रश्न में एक सर्कल का उल्लेख नहीं किया गया था। आपको कर्सर.क्लिप के साथ एक आयत का उपयोग करना होगा। माफ़ कीजिये! – FrostyFire

+0

वैसे यह परिपत्र भी नहीं है। मैं जो करने की कोशिश कर रहा हूं वह [इस] (http://i.imgur.com/6lpmk.jpg) को [इस] (http://i.imgur.com/KhWb0.jpg) में बदलकर वास्तव में बदल रहा है स्क्रीन संकल्प। – littlerat

3

समस्या यह है कि हुक आपको माउस संदेश के अधिसूचना देता है। लेकिन यह उस एप्लिकेशन द्वारा संसाधित होने से नहीं रोका जा रहा है जो वास्तव में अधिसूचना को संसाधित करने जा रहा है। तो यह सामान्य के रूप में संभाला जाता है और माउस चलता है जहां वह जाना चाहता है। आपको जो करने की ज़रूरत है वह वास्तव में संदेश को पारित होने से रोकता है, जिसके लिए हुक कॉलबैक से गैर-शून्य मान वापस करने की आवश्यकता होती है।

लाइब्रेरी आपको हुक कॉलबैक रिटर्न वैल्यू के साथ टिंकर करने की अनुमति नहीं देती है, इसे सर्जरी की आवश्यकता होगी। सावधान रहें यह छोटी है। मैं इसके बजाय this sample code का उपयोग करूंगा। इस नमूना कॉलबैक विधि के साथ:

private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam) { 
    if (nCode >= 0 && MouseMessages.WM_MOUSEMOVE == (MouseMessages)wParam) { 
     System.Windows.Forms.Cursor.Position = new Point(50, 50); 
     return (IntPtr)1; // Stop further processing! 
    } 
    return CallNextHookEx(_hookID, nCode, wParam, lParam); 
} 

और आप देखेंगे कि यह अब दृढ़ता से अटक गया है। नियंत्रण प्राप्त करने के लिए Alt + Tab, Alt + D, E का उपयोग करें।

+0

उत्कृष्ट उत्तर, मैंने जो किया वह कर्सर की स्थिति को सेट करने के बाद केवल एक बार सही इंटिप्ट (1) 'जोड़ता है और यह जगह पर बना रहता है और फिर भी उपयोगकर्ता को बाद की घटनाओं में माउस को स्थानांतरित करने की अनुमति देता है। –

संबंधित मुद्दे