2012-05-10 213 views
2

我有一個winforms應用程序,用幾個UserControls填充可滾動區域。 我的問題,無論如何總是捕捉滾輪滾動只要這個應用程序視圖是可見的?當然這個應用程序是積極的焦點。「總是」捕獲鼠標滾輪事件並滾動父級?

現在,我必須單擊滾動條出現的所有控件,您可以滾動槽來滾動鼠標滾輪。這我想忽略或跳過。我希望能夠在放置在可滾動區域的這些UserControl之一中的某個文本字段中進行單擊,然後如果通過鼠標滾輪進行滾動,則此UserControl不應該是試圖滾動的那個,而是可滾動的該UserControl所在的區域(父級)與所有其他UserControl一起放置。

回答

3

實現IMessageFilter在你的主要形式有:

public partial class YourForm : Form, IMessageFilter 
{ 
    // Your code. 

    public bool PreFilterMessage (ref Message m) 
    { 
     if (m.Msg == 0x20A) 
     { 
      NativeMethods.SendMessage (controlToScroll.Handle , m.Msg , m.WParam , m.LParam); 
      return true; 
     } 
     return false; 
    } 
} 

通過調用它的構造函數下面填寫您的形式作爲消息過濾器。

Application.AddMessageFilter (this); 

SendMessage具有以下特徵:

internal class NativeMethods 
{ 
    [DllImport ("user32.dll" , CharSet = CharSet.Auto)] 
    public static extern IntPtr SendMessage (IntPtr hWnd , Int32 Msg , IntPtr wParam , IntPtr lParam); 
} 
+0

好極了!謝謝。 –

+0

我有一個'WebBrowser'控件,實現'IMessageFilter'的地方還不夠:請參閱http://stackoverflow.com/questions/17228033/send-mousewheel-messages-to-system-windows-forms-webbrowser/17228034#17228034爲特定的解決方案。 –