C# &引用;“始终”;捕获鼠标滚轮事件并滚动父对象?
我有一个winforms应用程序,它用几个用户控件填充一个可滚动区域。 我的问题是,只要此应用程序视图可见,是否始终可以捕获鼠标滚轮滚动?当然,这个应用程序对于焦点是活跃的C# &引用;“始终”;捕获鼠标滚轮事件并滚动父对象?,c#,winforms,user-controls,scroll,mousewheel,C#,Winforms,User Controls,Scroll,Mousewheel,我有一个winforms应用程序,它用几个用户控件填充一个可滚动区域。 我的问题是,只要此应用程序视图可见,是否始终可以捕获鼠标滚轮滚动?当然,这个应用程序对于焦点是活跃的 现在我必须点击滚动条,它显示了所有的控件,你可以通过滚动来实现鼠标滚轮的滚动。我想忽略或跳过这一点。我希望能够单击位于可滚动区域的其中一个UserControl中的一个文本字段,然后如果我通过鼠标滚轮滚动,则此UserControl不应是尝试滚动的用户控件,而是此可滚动区域(父)此用户控件与所有其他用户控件放在一起。在主窗体
现在我必须点击滚动条,它显示了所有的控件,你可以通过滚动来实现鼠标滚轮的滚动。我想忽略或跳过这一点。我希望能够单击位于可滚动区域的其中一个UserControl中的一个文本字段,然后如果我通过鼠标滚轮滚动,则此UserControl不应是尝试滚动的用户控件,而是此可滚动区域(父)此用户控件与所有其他用户控件放在一起。在主窗体中实现
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 );
}
我在
WebBrowser
控件中也遇到了同样的问题,其中实现IMessageFilter
是不够的:请参阅以获取特定的解决方案。