这是我的截获方法:
public class MyFilter: IMessageFilter
{
public bool PreFilterMessage(ref Message m)
{
if(m.Msg == 0x0100 || m.Msg ==0x104)
{
if(TranslateMessage(m)==Shortcut.CtrlA)//在此判断消息
{ ……
MessageBox.Show("Filter");
return flale;
}
else return true;
}
return false
}
}
在初始处加入: myFilter=new MyFilter();
Application.AddMessageFilter(myFilter);
public class MyFilter: IMessageFilter
{
public bool PreFilterMessage(ref Message m)
{
if(m.Msg == 0x0100 || m.Msg ==0x104)
{
if(TranslateMessage(m)==Shortcut.CtrlA)//在此判断消息
{ ……
MessageBox.Show("Filter");
return flale;
}
else return true;
}
return false
}
}
在初始处加入: myFilter=new MyFilter();
Application.AddMessageFilter(myFilter);
解决方案 »
- datagridview更新数据不成功,哪里出问题了?
- 除了水晶报表,winform还有什么报表好用
- winform嵌入显示excel的问题
- 如何改变winform中DataGridView控件选中单元时的高亮颜色,就是大家都熟悉的深蓝色。
- UrlRewritingNet 无法找到该页
- Datagrid中选择下拉列表,Datagrid中的文本框就自动变成0
- C# TcpClient如何判断对方是否断开连接(包括物理网络不通、关闭套接字等)
- C#自定义属性提示转换失败
- C#中如何做分析图形。如直方图、饼图等
- 我准备用C#开发数据库管理软件?
- 序列化的问题
- 在线等侯,急急急,C#的一个简单问题,大批量给分!
你是指什么例子?
上面就是我的截获程序,我截获到的m通过TranslateMessage(m)被我翻译成为一个Shortcut,然后可以作我想作的事情,可如果如上所示,此时又出现一个MessageBox,那么这个被传递下去的m则这有一个A的消息,而不是Ctrl+A。
需要的话,我可以把我的整个程序发给你。
最好有具体实现:)
然后,我在PreFilterMessage中加了下面的一句MessageBox.Show("hi")
如下:
if(TranslateMessage(m)==myToolBar.Buttons[i].BShortcut)
{
myToolBar.OnButtonClick(new Object(),new MyEventArgs(i));//?????????
// SendKeys.Send("{g 10}");
// keybd_event ( 69, 0, 0 , 0 ) ;
// keybd_event ( 17, 0, 2, 0 );
MessageBox.Show("Hi");
// MsgBox();
// myToolBar.MsgBox(); return(!myToolBar.Buttons[i].IsMessageDispatched);
}这个时候,真的会出现问题:本来按Ctrl+C的时候应该会先弹出来一个“hi”,然后再弹出"menu 2",可这时只弹出一个"hi";按单键F1的时候就没有这个问题你说的是不是这样的?
我是在Form2上测试这个的。把光标放在Textbox里面,然后按Ctrl+C,如果弹出MessageBox,则文本框里面会写下一个C,表明传下去的消息只是一个字符。如果没有MessageBox,则按顺序就该传给Menu去响应的。
我的myToolBar.OnButtonClick是调的Form2里的这个事件响应:
private void myToolBar1_ButtonClick,用户可以在此设置每个按钮作不同的工作(与Toolbar是一样的),本意是检测用户按下的是哪个按钮的快捷键,就去调用这个按钮该做的事。(这里面就会出现MessageBox或其他模式对话框)这样说明白了么?
MessageBox无论在什么地方都会出这个问题不过
现在,我已经解决了
在myToolBar1_ButtonClick中加上:foreach (System.Windows.Forms.MenuItem mnu in this.mainMenu1.MenuItems)
{
if (mnu.Shortcut==myToolBar1.Buttons[args.Index].BShortcut)
{
mnu.PerformClick();
}
}看看,没问题了吧,即使有n个messagebox也没关系
问题1:这个myToolBar1_ButtonClick应该属于用户使用时设置的东西,我不可能强制用户来写下这些代码。在整个的Test project都仅是为了测试toolbar,可以看成是用户在使用toolbar。而我必须在他使用之前把全部功能已经做好。也就是只能在这个MyToolbar项目中进行更改设置。
问题2:我不知道mnu.PerformClick()是不是只是针对于激活menuitem,而不会针对系统发出一个消息。正在试验ing……
不知道还有没有其他发送消息的方法,寻找…………期待…………
up
up...
thinking...