2

我有一个 winforms 应用程序,它使用几个 UserControls 填充可滚动区域。我的问题是,只要此应用程序视图可见,是否总是捕获鼠标滚轮滚动?当然,这个应用程序是活跃的焦点。

现在,我必须单击为所有可以滚动的控件显示的滚动条,以使鼠标滚轮滚动工作。我想忽略或跳过这个。我希望能够单击放置在可滚动区域中的这些 UserControls 之一中的文本字段之一,然后如果我通过鼠标滚轮滚动,则此 UserControl 不应该是尝试滚动的那个,但是这个可滚动此 UserControl 与所有其他 UserControl 一起放置的区域(父级)。

4

1 回答 1

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 );
}
于 2012-05-10T08:54:48.047 回答