2011-10-28 13 views
3

フォーム内のすべてのコントロールにマウスクリックイベントを配置することなく、マウスの左ボタンをクリックするとサウンドが再生されます。これを達成する方法はありますか?C#アプリケーション全体の左マウスクリックイベント

+0

WinFormsの代わりにWPFを検討することを検討してください。 WPFイベントは自動的に親コントロールにバブリングされるので、これは簡単です。 –

答えて

7

を行う必要があります。

public partial class Form1 : Form, IMessageFilter { 
    public Form1() { 
     InitializeComponent(); 
     Application.AddMessageFilter(this); 
     this.FormClosed += delegate { Application.RemoveMessageFilter(this); }; 
    } 

    public bool PreFilterMessage(ref Message m) { 
     // Trap WM_LBUTTONDOWN 
     if (m.Msg == 0x201) { 
      System.Diagnostics.Debug.WriteLine("BEEP!"); 
     } 
     return false; 
    } 
} 

これは、メインのプロジェクトだけでなく、プロジェクト内のどのフォームでも機能します。

+0

驚くばかり!ありがとうございました!ああ、私にとっては左マウスボタンの値は 'm.Msg == 0x0201'でした – Spidermain50

0

This project(あなたのフォームにあるものだけでなく、グローバルなマウスイベントをフックするので)あなたのニーズには余計かもしれませんが、必要なものの基礎を示していると思います。

+1

マウスやキーボードをグローバルにフックすることは時折役立ちますが、ローカルで処理できるものをグローバルにフックすることはありません。 –

3

これは、それがIMessageFilterをインタフェースとフォーカスを持つコントロールにディスパッチされる前に、Windowsの通知を検出することができますトリック

const int WM_PARENTNOTIFY = 0x210; 
const int WM_LBUTTONDOWN = 0x201; 

protected override void WndProc(ref Message m) 
{ 
    if (m.Msg == WM_LBUTTONDOWN || (m.Msg == WM_PARENTNOTIFY && (int)m.WParam == WM_LBUTTONDOWN)) 
     DoIt(); 
    base.WndProc(ref m); 
} 
+0

恐ろしい豆。この+ soooシンプルな検索年齢。乾杯。 – stigzler

関連する問題