如何为ListView制作滚动事件

我想为ListView中的滚动创建一个事件。

我发现了一些有效的东西,但它只在使用滚动条时触发事件。 它不响应鼠标滚轮或箭头滚动。

private const int WM_HSCROLL = 0x114; private const int WM_VSCROLL = 0x115; public event EventHandler Scroll; protected void OnScroll() { if (this.Scroll != null) this.Scroll(this, EventArgs.Empty); } protected override void WndProc(ref System.Windows.Forms.Message m) { base.WndProc(ref m); if (m.Msg == WM_HSCROLL || m.Msg == WM_VSCROLL ) this.OnScroll(); } 

为鼠标滚轮和键盘上/下按钮触发滚动事件需要什么常量?

鼠标滚轮m.Msg值应为:

 private const int WM_MOUSEWHEEL = 0x020A; 

我找到了其他常量,用于在向下箭头键和键盘上的结束键上进行滚动。这是CustomListView的代码

 using System; using System.Windows.Forms; class MyListView : ListView { public event ScrollEventHandler Scroll; private const int WM_HSCROLL = 0x114; private const int WM_VSCROLL = 0x115; private const int MOUSEWHEEL = 0x020A; private const int KEYDOWN = 0x0100; protected virtual void OnScroll(ScrollEventArgs e) { ScrollEventHandler handler = this.Scroll; if (handler != null) handler(this, e); } protected override void WndProc(ref Message m) { base.WndProc(ref m); if (m.Msg == MOUSEWHEEL || m.Msg == WM_VSCROLL || (m.Msg == KEYDOWN && (m.WParam == (IntPtr)40 || m.WParam == (IntPtr)35))) { // Trap WM_VSCROLL OnScroll(new ScrollEventArgs((ScrollEventType)(m.WParam.ToInt32() & 0xffff), 0)); } } }