사용의 IMessageFilter
public partial class MyForm: Form, IMessageFilter
...
public ImageForm(Image initialImage)
{
InitializeComponent();
Application.AddMessageFilter(this);
}
/// <summary>
/// Filters out a message before it is dispatched.
/// </summary>
/// <returns>
/// true to filter the message and stop it from being dispatched; false to allow the message to continue to the next filter or control.
/// </returns>
/// <param name="m">The message to be dispatched. You cannot modify this message. </param><filterpriority>1</filterpriority>
public bool PreFilterMessage(ref Message m)
{
if (m.Msg.IsWindowMessage(WindowsMessages.MOUSEWHEEL)) //if (m.Msg == 0x20a)
{ // WM_MOUSEWHEEL, find the control at screen position m.LParam
var pos = new Point(m.LParam.ToInt32() & 0xffff, m.LParam.ToInt32() >> 16);
var hWnd = WindowFromPoint(pos);
if (hWnd != IntPtr.Zero && hWnd != m.HWnd && FromHandle(hWnd) != null)
{
SendMessage(hWnd, m.Msg, m.WParam, m.LParam);
return true;
}
}
return false;
}
[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);
또한 양식을 닫는 추가에 (전용 마우스 휠 여기에 갇혀 있지만)
Application.RemoveMessageFilter(this);
이이 모든 창 메시지를 데리러 -을 찾기 위해 mouseposition를 사용하여 그것의 위에 통제, 당신은 그 때 아무 통제도 없더라도 그 통제에 메시지를 보내는 창을 강제 할 수있다.
참고 : 나는 그 메시지를 열거 한 클래스에서입니다 WindowsMessages.MOUSEWHEEL을 사용하고, 단지 말
에 주석 비트
if (m.Msg.IsWindowMessage(WindowsMessages.MOUSEWHEEL))
교체 if (m.Msg == 0x20a)
http://stackoverflow.com/questi on/10999659/make-mouse-tilt-horizontal-scroll-always-repeat, 솔루션은 VB.NET이지만 C#으로 쉽게 변환됩니다. – Viezevingertjes
감사. 그것은 내가 이미 구현 한 것입니다. 문제는 메시지를 처리하지 않는 것입니다. 문제는 메시지가 한 번만 전송된다는 것입니다. 이것은 Explorer.exe에서도 마찬가지이므로 계속 스크롤하는 방법을 이해하지 못합니다. Spy ++에서 추가 메시지를 볼 수 없습니다 ... – l33t