c#在Form上注册任何MouseClick事件

时间:2018-03-19 07:46:44

标签: c# winforms mouseclick-event

我希望每次鼠标点击表单上的任何位置时都会生成一个事件。

目前,我设定了这个:

this.MouseClick += new System.Windows.Forms.MouseEventHandler(this.Form_MouseClick);

但这仅在不点击任何其他元素(如面板)时有效 有什么方法可以覆盖这个吗?

2 个答案:

答案 0 :(得分:2)

您可以在表单类中监听WndProc,覆盖方法:

protected override void WndProc(ref Message m)
{
    //0x210 is WM_PARENTNOTIFY
    if (m.Msg == 0x210 && m.WParam.ToInt32() == 513) //513 is WM_LBUTTONCLICK
    {
        Console.WriteLine(m); //You have a mouseclick(left)on the underlying user control
    }
    base.WndProc(ref m);
}

答案 1 :(得分:-1)

您需要动态遍历表单中的所有控件并添加MouseClick事件处理程序。 请检查此答案:not-null property references a null or transient value in one to one relation

下面的代码将MouseClick事件处理程序添加到第一级控件:

foreach (Control c in this.Controls)
{
   c.MouseClick += new MouseEventHandler(
     delegate(object sender, MouseEventArgs e)
     {
       // handle the click here
     });
 }

但是如果你的控件有clild控制,那么你将不得不以递归方式添加eventhandler:

void initControlsRecursive(ControlCollection coll)
 { 
    foreach (Control c in coll)  
     {  
       c.MouseClick += (sender, e) => {/* handle the click here  */});  
       initControlsRecursive(c.Controls);
     }
 }

/* ... */
initControlsRecursive(Form.Controls);