4

I want to play a sound when the left mouse button is clicked anywhere in my form without having to place Mouse click events on every single control in the form. Is there a way to accomplish this?

SLaks
  • 868,454
  • 176
  • 1,908
  • 1,964
Spidermain50
  • 689
  • 1
  • 12
  • 23
  • Consider looking at WPF instead of WinForms. WPF events are automatically bubbled up to parent controls, so this would be trivial. – Joe White Oct 28 '11 at 21:13

4 Answers4

8

You can detect the Windows notification before it is dispatched to the control with the focus with the IMessageFilter interface. Make it look similar to this:

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

This works for any form in your project, not just the main one.

Hans Passant
  • 922,412
  • 146
  • 1,693
  • 2,536
4

This should do the trick

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);
}
L.B
  • 114,136
  • 19
  • 178
  • 224
0

Case WM_PARENTNOTIFY Select Case Wparam Case 513 ' WM_LBUTTODOWN PlaySoundA End Select

Using For Vb Or Vba

0

This project may be overkill for your needs (since it hooks global mouse events, not just ones on your form), but I think it shows the basics of what you need.

MusiGenesis
  • 74,184
  • 40
  • 190
  • 334