2011-01-22 12 views
6

मेरे पास एक विंडोज फॉर्म है (सी # .NET में काम कर रहा है)।विंडोज फॉर्म: माउसहेल कैप्चरिंग

इस फॉर्म में कुछ पैनल शीर्ष-पक्ष हैं और कुछ कॉम्बोबॉक्स और डेटाग्रिड व्यू नीचे की तरफ हैं।

मैं शीर्ष-पक्ष पैनलों पर स्क्रॉल ईवेंट का उपयोग करना चाहता हूं, लेकिन यदि कोई उदाहरण चुनना है कॉम्बोबॉक्स फोकस खो गया है। पैनलों में कई अन्य नियंत्रण होते हैं।

जब माउस किसी भी पैनल पर होता है तो मैं हमेशा माउस व्हील इवेंट कैसे प्राप्त कर सकता हूं? अब तक मैंने माउसइंटर/माउसइंटर कार्यक्रमों का उपयोग करने की कोशिश की लेकिन बिना किसी किस्मत के।

उत्तर

13

आप ध्वनियों क्या वर्णन है जैसे आप की कार्यक्षमता को दोहराने के लिए चाहते हैं उदाहरण माइक्रोसॉफ्ट आउटलुक, जहां आप वास्तव में माउस का उपयोग करने नियंत्रण ध्यान केंद्रित करने के लिए क्लिक करने की जरूरत नहीं के लिए उस पर पहिया

यह हल करने के लिए एक अपेक्षाकृत उन्नत समस्या है: यह युक्त फार्म के IMessageFilter इंटरफेस को लागू करने, WM_MOUSEWHEEL घटनाओं की तलाश में है और उन्हें नियंत्रण है कि माउस पर मँडरा रहा है करने के लिए निर्देशन करना शामिल है।

using System; 
using System.ComponentModel; 
using System.Drawing; 
using System.Windows.Forms; 
using System.Runtime.InteropServices; 

namespace WindowsApplication1 { 
    public partial class Form1 : Form, IMessageFilter { 
    public Form1() { 
     InitializeComponent(); 
     Application.AddMessageFilter(this); 
    } 

    public bool PreFilterMessage(ref Message m) { 
     if (m.Msg == 0x20a) { 
     // WM_MOUSEWHEEL, find the control at screen position m.LParam 
     Point pos = new Point(m.LParam.ToInt32()); 
     IntPtr hWnd = WindowFromPoint(pos); 
     if (hWnd != IntPtr.Zero && hWnd != m.HWnd && Control.FromHandle(hWnd) != null) { 
      SendMessage(hWnd, m.Msg, m.WParam, m.LParam); 
      return true; 
     } 
     } 
     return false; 
    } 

    // P/Invoke declarations 
    [DllImport("user32.dll")] 
    private static extern IntPtr WindowFromPoint(Point pt); 
    [DllImport("user32.dll")] 
    private static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wp, IntPtr lp); 
    } 
} 

ध्यान दें कि यह कोड अपने आवेदन में सभी रूपों, न सिर्फ मुख्य रूप के लिए सक्रिय है:

यहाँ एक उदाहरण (here से) है।

+0

धन्यवाद, इसे वहां देखा लेकिन मुझे यकीन नहीं है कि WM_MOUSEWHEEL का प्रबंधन क्यों करना वांछनीय नहीं है। – n0ter

+0

अरे, यह मेरा कोड है! इतना निश्चित नहीं है कि यदि आवश्यक विशेषता यहां उचित है, तो यह होना चाहिए। –

+0

पोस्टर बनाता है कि टिप्पणी "विंडोज़ 'हैंडलिंग की तरह विंडोज़ हैंडलिंग बहुत वांछनीय नहीं है", जिसका मतलब है कि माउस व्हील के डिफ़ॉल्ट विंडोज कार्यान्वयन का अर्थ है कि यह घटनाओं को ध्यान में रखता है, नियंत्रण नहीं कि माउस घुमा रहा है अधिकतर, क्योंकि अधिकांश लोग उम्मीद करेंगे या इच्छा करेंगे। –

0

प्रत्येक नियंत्रण में एक मूसहेल घटना होती है जो तब होता है जब नियंत्रण चक्र पर ध्यान केंद्रित करते समय माउस व्हील चलता है।

अधिक जानकारी के लिए इस की जाँच करें: Control.MouseWheel Event

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