这问题不难。。 屏蔽鼠标右击事件在winform里面如何实现啊?做了一个过滤器,,,整的整个页面都不能右击了。。这不是我想要的结果。我只想让其中一个控件不能右击。。求救。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 给第三方控件添加右键处理函数,然后加入这段话:e.Handled = true; class MyTextBox : TextBox { public MyTextBox() { } protected override void WndProc(ref Message m) { if (m.Msg == 0x204 || m.Msg == 0x205) { return; } else base.WndProc(ref m); } } 既然过滤了,是过滤消息吧,IMesssageFilter?不是可以判断m.Handle么,对比看是否是要屏蔽的控件句柄,是就屏蔽,反之放过。 protected override void WndProc(ref Message m) { if(m.Msg == 0x0204){ MessageBox.Show( "你按下右键 "); } else { base.WndProc(ref m); } } TextBox.ShortcutsEnabled为False自定义右键菜单 protected override void WndProc(ref Message m) { if(m.Msg == 0x0204){ MessageBox.Show( "你按下右键 "); } else { base.WndProc(ref m); } }我顶! 我怎么就没找到m.Handle呢????? 这根本就不对。。这只对Winform窗体起作用。。我都说了。。我想让第三方控件的右击事件屏蔽。这段代码一点作用都没有属于盲目的顶。 WndProc要放到子类才有效果参考5楼 更有趣的事情又发生了在子类里面只能写一些普通的控件TextBox (就连Button都没有那个方法来。)。第三方控件 根本就没有WndProc这个方法。 我就一个第三方控件啊只是你的这个方法可能只是用你的那个例子吧。。(TextBox).....我还是想用过滤器。。只不过不知道如何通过判断句柄 来屏蔽。 public partial class Form1 : Form, IMessageFilter { public Form1() { InitializeComponent(); Application.AddMessageFilter(this); } public bool PreFilterMessage(ref System.Windows.Forms.Message SystemMessage) { if ((SystemMessage.Msg == 0x0204 || SystemMessage.Msg == 0x0205) && SystemMessage.HWnd == button1.Handle) { return true; } return false; } private void button1_MouseDown(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Right) { MessageBox.Show("右键了"); } } } 兄弟。。这个可以用。。但是为啥不加那个 MessageBox.Show("右键了");就还是出现右击事件的框 刚我测试的时候。。又发现我错怪你了。。这个根本就不好使啊就算是不写上面的方法。。只要加个MessageBox就可以用了。。在当你快速的点MessageBox确定的时候,。。你会发现。。偶尔还会出现原有的右击事件上面的过滤器没起作用。谁能告诉我为什么。。 控件只带鼠标按下事件,控件名字:AxDrawingControl。可以在里面判断是点击了什么(if(e.button==1||2||16)) ...我试过了好多次了。。都没有解决呢。首先我用了个整个窗口的过滤器..(老大说不行,只有在控件里面才要失去鼠标右击).失败。后来像楼上的哥们说的方法我做了下。。只有MessageBox起作用了。。别的都没用。。失败。后来我看他们说重写WnpProc()。。但是里面根本就没有这个方法。。又不知道怎么办了。在后来。。我想到了把控件包到自定义控件里面。然后在这个自定义控件里面设置右击事件。。但是不知道原因。还是不行。。现在还在继续努力。 问题解决了还是用过滤器呵呵。。说下大致方法。 public bool PreFilterMessage(ref System.Windows.Forms.Message SystemMessage) { if ((SystemMessage.Msg == 0x0204 || SystemMessage.Msg == 0x0205) && SystemMessage.HWnd == button1.Handle) { return true; } return false; }还是用这个过滤器。上面的如果只是Button也许不会出现我这样的问题。因为它的句柄就一个。(此问题只针对我的问题,如有错误地方。还请见谅)public bool PreFilterMessage(ref System.Windows.Forms.Message SystemMessage) { //intPtr pt=AxDrawingControl1.HWnd;//先用这个看下这个控件的句柄 例如是100223 intPtr ptr=new IntPtr(100223);//方法很笨。。但是很实用。。呵呵 if ((SystemMessage.Msg == 0x0204 || SystemMessage.Msg == 0x0205) && SystemMessage.HWnd == ptr) { return true; } return false; } 也许你们认为不用这么麻烦。。但是当你遇见一个很大的第三方控件的时候,你会发现,这个控件的句柄并不是一个大部分都是一个区域一个内部句柄。。(问题不难。。但是大家都要注意) Sorry..我又错了程序关闭时候。。下次内部句柄就变了。。所以要这样写。。int axdrawing = AxDrawingControl.window.WindowHandle32;if ((SystemMessage.Msg == 0x0204 || SystemMessage.Msg == 0x0205) && SystemMessage.HWnd.ToInt32() == axdrawing)这样才算是真正的实现。结贴了。 新人问题,为什么“ this.Text = "我的第一个程序";//也可写为:this.Text="我的第一个程序";”没执行? datagridview中设置列宽 怎么把枚举a克隆到枚举b? -=代表什么意思(是下划线) C# mulithreads 多线程问题 新手求解!!!!!!!!!!!!!!!!! 关于winform程序的发布和部署的问题 如何在窗体打开时,利用赋值方式设置窗体的大小? 怎么让消息弹出后不操作能继续进行下一步 一个非常奇怪的问题~!!!! C# 前台 怎么使用 If Else 语句 Word表格行高,不规则,行列都有合并的单元格
class MyTextBox : TextBox
{
public MyTextBox()
{
} protected override void WndProc(ref Message m)
{
if (m.Msg == 0x204 || m.Msg == 0x205)
{
return;
}
else
base.WndProc(ref m);
}
}
既然过滤了,是过滤消息吧,IMesssageFilter?不是可以判断m.Handle么,对比看是否是要屏蔽的控件句柄,是就屏蔽,反之放过。
{
if(m.Msg == 0x0204)
{
MessageBox.Show( "你按下右键 ");
}
else
{
base.WndProc(ref m);
}
}
自定义右键菜单
{
if(m.Msg == 0x0204)
{
MessageBox.Show( "你按下右键 ");
}
else
{
base.WndProc(ref m);
}
}
我顶!
我怎么就没找到m.Handle呢?????
这根本就不对。。这只对Winform窗体起作用。。我都说了。。
我想让第三方控件的右击事件屏蔽。这段代码一点作用都没有属于盲目的顶。
参考5楼
更有趣的事情又发生了在子类里面只能写一些普通的控件TextBox (就连Button都没有那个方法来。)。第三方控件 根本就没有WndProc这个方法。
我就一个第三方控件啊只是你的这个方法可能只是用你的那个例子吧。。(TextBox).....
我还是想用过滤器。。只不过不知道如何通过判断句柄 来屏蔽。
{
public Form1()
{
InitializeComponent();
Application.AddMessageFilter(this);
} public bool PreFilterMessage(ref System.Windows.Forms.Message SystemMessage)
{ if ((SystemMessage.Msg == 0x0204 || SystemMessage.Msg == 0x0205) && SystemMessage.HWnd == button1.Handle)
{
return true;
} return false;
} private void button1_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Right)
{
MessageBox.Show("右键了");
}
}
}
兄弟。。这个可以用。。但是为啥不加那个 MessageBox.Show("右键了");
就还是出现右击事件的框
刚我测试的时候。。又发现我错怪你了。。这个根本就不好使啊就算是不写上面的方法。。只要加个MessageBox就可以用了。。在当你快速的点MessageBox确定的时候,。。你会发现。。偶尔还会出现原有的右击事件上面的过滤器没起作用。谁能告诉我为什么。。
控件只带鼠标按下事件,控件名字:AxDrawingControl。可以在里面判断是点击了什么(if(e.button==1||2||16)) ...
我试过了好多次了。。都没有解决呢。
首先我用了个整个窗口的过滤器..(老大说不行,只有在控件里面才要失去鼠标右击).失败。
后来像楼上的哥们说的方法我做了下。。只有MessageBox起作用了。。别的都没用。。失败。
后来我看他们说重写WnpProc()。。但是里面根本就没有这个方法。。又不知道怎么办了。
在后来。。我想到了把控件包到自定义控件里面。然后在这个自定义控件里面设置右击事件。。但是不知道原因。还是不行。。
现在还在继续努力。
说下大致方法。
public bool PreFilterMessage(ref System.Windows.Forms.Message SystemMessage)
{ if ((SystemMessage.Msg == 0x0204 || SystemMessage.Msg == 0x0205) && SystemMessage.HWnd == button1.Handle)
{
return true;
} return false;
}
还是用这个过滤器。上面的如果只是Button也许不会出现我这样的问题。因为它的句柄就一个。(此问题只针对我的问题,如有错误地方。还请见谅)
public bool PreFilterMessage(ref System.Windows.Forms.Message SystemMessage)
{
//intPtr pt=AxDrawingControl1.HWnd;//先用这个看下这个控件的句柄 例如是100223
intPtr ptr=new IntPtr(100223);//方法很笨。。但是很实用。。呵呵
if ((SystemMessage.Msg == 0x0204 || SystemMessage.Msg == 0x0205) && SystemMessage.HWnd == ptr)
{
return true;
} return false;
} 也许你们认为不用这么麻烦。。但是当你遇见一个很大的第三方控件的时候,你会发现,这个控件的句柄并不是一个大部分都是一个区域一个内部句柄。。(问题不难。。但是大家都要注意)
所以要这样写。。
int axdrawing = AxDrawingControl.window.WindowHandle32;
if ((SystemMessage.Msg == 0x0204 || SystemMessage.Msg == 0x0205) && SystemMessage.HWnd.ToInt32() == axdrawing)
这样才算是真正的实现。结贴了。