Riprendo un mio precedente
post su come ottenere lo scroll con il mouse wheel su un controllo che non possa avere il focus.
La soluzione suggerita aveva dei problemi, ed in particolare non gestiva bene il caso in cui il controllo si trovasse all'interno di una form di tipo mdichild, da cui si poteva aprire una form modale.... Ok, non vado avanti nei particolari, ma dico semplicemente che aveva dei problemi.
Per cui qui suggerisco un'altra soluzione, che mi sembra funzionare correttamente e che ho trovato googlando a partire dalla prima.
1: Public Class MyForm
2: Inherits System.Windows.Forms.Form
3: Implements IClassWithLanguage, IMessageFilter
4:
5: Public Function PreFilterMessage(ByRef m As Message) As Boolean Implements IMessageFilter.PreFilterMessage
6: Try
7: If (m.Msg = &H20A) Then
8: ' WM_MOUSEWHEEL, find the control at screen position m.LParam
9: Dim pos As Point = New Point(m.LParam.ToInt32() And &HFFFF, m.LParam.ToInt32() >> 16)
10: Dim hWnd As IntPtr = WindowFromPoint(pos)
11: If (hWnd <> IntPtr.Zero AndAlso hWnd <> m.HWnd AndAlso Not Control.FromHandle(hWnd) Is Nothing) Then
12: SendMessage(hWnd, m.Msg, m.WParam, m.LParam)
13: Return True
14: End If
15: End If
16: Return False
17: Catch ex As Exception
18: ' Trascura l'eccezione
19: End Try
20: End Function
21:
22: ' P/Invoke declarations
23: <DllImport("user32.dll")> _
24: Private Shared Function WindowFromPoint(ByVal pt As Point) As Int32
25: End Function
26: <DllImport("User32.dll")> _
27: Private Shared Function SendMessage(ByVal hWnd As Integer, ByVal Msg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Int32
28: End Function