方法一: 用windows api 钩子程序 获取鼠标事件
方法二: 在form窗体的构造函数中注册所有子控件的鼠标事件到自身的click事件中
foreach (var item in this.Controls) { ((Control)item).MouseClick += new MouseEventHandler(Form1_MouseClick); }
方法三: 重写WndProc
/// <summary> /// windows消息窗体 屏蔽鼠标操作 /// </summary> /// <param name="m"></param> protected override void WndProc(ref Message m) { if (m.Msg == 0x201 || m.Msg == 0x202 || m.Msg == 0x203 || m.Msg == 0x204 || m.Msg == 0x205 || m.Msg == 0x206 || m.Msg == 0x207 || m.Msg == 0x208 || m.Msg == 0x209) { return; } base.WndProc(ref m); }
其实我想实现的功能是点击一个按钮弹出一个panel 然后点击任何地方移除这个panel
@拖鞋王子: 点击任何地方具体指程序窗体内还是任一地方,包括桌面
@WuRang: 程序窗体内的
@拖鞋王子: 为什么不用ContextMenuStrip而用panel?
@WuRang: 不过按你的要求用pancel也可以,给panel加事件
panel.Capture = true;
panel.MouseCaptureChanged += panel_MouseCaptureChanged;
然后在事件里做处理
void panel_MouseCaptureChanged(object sender, EventArgs e)
{
if (panel.Capture == false)
{
this.Controls.Remove(panel);
}
}
public partial class Form1 : Form { Panel panel = new Panel(); public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { panel.Width = 50; panel.Height = 50; panel.BackColor = Color.Red; panel.Location = new Point(20, 20); this.Controls.Add(panel); panel.Capture = true; panel.MouseCaptureChanged += panel_MouseCaptureChanged; } void panel_MouseCaptureChanged(object sender, EventArgs e) { if (panel.Capture == false) { this.Controls.Remove(panel); } } }
@WuRang: 正解,我试了,这个方案可行
mouseup
不行
mouse move, mouseclick
可以屏蔽鼠标事件,谢谢了