2012-06-28 5 views
2

Logitech M705 마우스에는 가로 스크롤이 가능한 스크롤 휠이 있습니다. 성공적으로 내 C# 프로그램에서 (here 설명한 구현 된)이 단추 이벤트에 대한 처리기를 구현 한 지금까지 스크롤 한 번만 얻을 수 있습니다. 탐색기에서 휠을 오른쪽으로 누르면 휠을 놓을 때까지 을 연속으로으로 스크롤합니다. 내 프로그램에서는 한 단계 만 스크롤합니다. WM_MOUSEHWHEEL 메시지를 놓고 다시 휠을 누르기 전까지는 메시지가 표시되지 않습니다.탐색기에서 WM_MOUSEHWHEEL을 처리하는 방법은 무엇입니까?

Q : 당신은 어떻게 WM_MOUSEHWHEEL 메시지 연속 수평 스크롤을 구현합니까?

+0

http://stackoverflow.com/questi on/10999659/make-mouse-tilt-horizontal-scroll-always-repeat, 솔루션은 VB.NET이지만 C#으로 쉽게 변환됩니다. – Viezevingertjes

+0

감사. 그것은 내가 이미 구현 한 것입니다. 문제는 메시지를 처리하지 않는 것입니다. 문제는 메시지가 한 번만 전송된다는 것입니다. 이것은 Explorer.exe에서도 마찬가지이므로 계속 스크롤하는 방법을 이해하지 못합니다. Spy ++에서 추가 메시지를 볼 수 없습니다 ... – l33t

답변

1

는 모든 컨트롤 (양식, 자녀 등)이 추가 :

protected override void WndProc(ref System.Windows.Forms.Message m) 
{ 
    base.WndProc(ref m); 

    const int WM_MOUSEHWHEEL = 0x020E; 
    if (m.Msg == WM_MOUSEHWHEEL) 
    { 
     m.Result = new IntPtr(HIWORD(m.WParam)/WHEEL_DELTA); 
    } 
} 

의 핵심은 메시지를 처리 ​​할 수있는 모든 컨트롤에 대해 0이 아닌 값을 반환하는 것입니다!

0

사용의 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)

관련 문제