C # ListView de rolagem do mouse roda sem foco
Pergunta
Eu estou fazendo um aplicativo WinForms com um conjunto ListView ao detalhe para que várias colunas podem ser exibidos.
Eu gostaria que esta lista para rolar quando o mouse está sobre o controle eo usuário usa a roda de rolagem do mouse. Neste momento, a rolagem só acontece quando a ListView tem foco.
Como posso fazer a rolagem ListView, mesmo quando ele não tem foco?
Solução
Você normalmente só recebem eventos de mouse / teclado para uma janela ou controle quando ele tem o foco. Se você quiser vê-los sem foco, então você vai ter que colocar no lugar um gancho de nível inferior.
Outras dicas
"Simples" e solução de trabalho:
public class FormContainingListView : Form, IMessageFilter
{
public FormContainingListView()
{
// ...
Application.AddMessageFilter(this);
}
#region mouse wheel without focus
// P/Invoke declarations
[DllImport("user32.dll")]
private static extern IntPtr WindowFromPoint(Point pt);
[DllImport("user32.dll")]
private static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wp, IntPtr lp);
public bool PreFilterMessage(ref Message m)
{
if (m.Msg == 0x20a)
{
// WM_MOUSEWHEEL, find the control at screen position m.LParam
Point pos = new Point(m.LParam.ToInt32() & 0xffff, m.LParam.ToInt32() >> 16);
IntPtr hWnd = WindowFromPoint(pos);
if (hWnd != IntPtr.Zero && hWnd != m.HWnd && System.Windows.Forms.Control.FromHandle(hWnd) != null)
{
SendMessage(hWnd, m.Msg, m.WParam, m.LParam);
return true;
}
}
return false;
}
#endregion
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow