我希望每次鼠标点击表单上的任何位置时都会生成一个事件。
目前,我设定了这个:
this.MouseClick += new System.Windows.Forms.MouseEventHandler(this.Form_MouseClick);
但这仅在不点击任何其他元素(如面板)时有效 有什么方法可以覆盖这个吗?
答案 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);