30

WinForm C# アプリケーションで MouseEvents に問題があります。

アプリケーションですべてのマウス クリックを取得したいのですが、すべての子コンポーネントにリスナーを配置したり、Windows マウス フックを使用したりしたくありません。

Flash では、ステージにリスナーを配置して、ムービーのすべての MouseEvent を取得できます。

C# にそのようなものはありますか? グローバルな MouseListener?


編集:

IMessageFilter からこのクラスを作成し、Application.AddMessageFilter を使用します。

public class GlobalMouseHandler : IMessageFilter{

    private const int WM_LBUTTONDOWN = 0x201;

    public bool PreFilterMessage(ref Message m){
        if (m.Msg == WM_LBUTTONDOWN) {
            // Do stuffs
        }
        return false;
    }
}

そして、グローバル クリックをリッスンする必要があるコントロールにこのコードを配置します。

GlobalMouseHandler globalClick = new GlobalMouseHandler();
Application.AddMessageFilter(globalClick);
4

4 に答える 4

5

サンプルクラス

class CaptureEvents : IMessageFilter
{
    #region IMessageFilter Members
    public delegate void Callback(int message);
    public event Callback MessageReceived;

    IntPtr ownerWindow;
    Hashtable interestedMessages = null;
    CaptureEvents(IntPtr handle, int[] messages)
    {
        ownerWindow = handle;
        for(int c = 0; c < messages.Length ; c++)
        {
            interestedMessages[messages[c]] = 0;
        }
    }
    public bool PreFilterMessage(ref Message m)
    {
        if (m.HWnd == ownerWindow && interestedMessages.ContainsKey(m.Msg))
        {
            MessageReceived(m.Msg);
        }
        return true;
    }

    #endregion
}
于 2010-12-10T16:39:47.127 に答える
3

この記事を見てください。すべてのコントロール イベントを再帰的にフックし、それらをブロードキャストします。フォームでWndProcをオーバーライドすることもできます。

于 2009-04-29T21:49:08.453 に答える