2011-01-22 7 views
6

私はWindowsフォーム(C#.NETで動作)を持っています。Windowsフォーム:MouseWheelのキャプチャ

フォームの上部には2つのパネルがあり、下部にはいくつかのComboBoxとDataGridViewがあります。

トップサイドパネルでスクロールイベントを使用しますが、 ComboBoxフォーカスが失われます。パネルにはさまざまなコントロールが含まれています。

マウスがどのパネルの上にあってもマウスホイールイベントをいつでも受け取ることができますか? これまで、私はMouseEnter/MouseEnterイベントを使用しようとしましたが、運がありませんでした。

答えて

13

:詳細は

チェックこのアウトその上の車輪。

これは解決するために比較的進んだ問題です。これは、含まれるフォームのIMessageFilterインターフェイスを実装し、WM_MOUSEWHEELイベントを探して、マウスがホバーオーバーしているコントロールにそれらを誘導します。このコードは、アプリケーション内のすべてのフォームだけでなく、メインフォームのためにアクティブであることを

using System; 
using System.ComponentModel; 
using System.Drawing; 
using System.Windows.Forms; 
using System.Runtime.InteropServices; 

namespace WindowsApplication1 { 
    public partial class Form1 : Form, IMessageFilter { 
    public Form1() { 
     InitializeComponent(); 
     Application.AddMessageFilter(this); 
    } 

    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()); 
     IntPtr hWnd = WindowFromPoint(pos); 
     if (hWnd != IntPtr.Zero && hWnd != m.HWnd && Control.FromHandle(hWnd) != null) { 
      SendMessage(hWnd, m.Msg, m.WParam, m.LParam); 
      return true; 
     } 
     } 
     return false; 
    } 

    // 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); 
    } 
} 

注:

はここ(hereから)例です。

+0

ありがとう、そこにそれを見ましたが、なぜWM_MOUSEWHEELの取り扱いがあまり望ましくないのかわかりません。 – n0ter

+0

ねえ、それは私のコードです!必要な属性がここで適切であるかどうかは分かりませんが、そうすべきです。 –

+0

ポスターが投稿するコメントは、「WindowsのMouseWheelイベントの処理はあまり望ましくない」ということです。つまり、マウスホイールのデフォルトのWindows実装は、マウスがホバーしているコントロールではなく、フォーカスを持ったコントロールにイベントを送信することを意味します。ほとんどの人が期待するか、望むように、 –

0

すべてのコントロールには、コントロールにフォーカスがある間にマウスホイールが動いたときに発生するマウスホイールイベントがあります。あなたが実際にマウスを使用するように制御を集中するクリックする必要はありませんたとえばのMicrosoft Outlookの機能を複製するようにあなたが音を記述する何Control.MouseWheel Event

関連する問題