这是我的截获方法:
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);

解决方案 »

  1.   

    To李兄:
    你是指什么例子?
    上面就是我的截获程序,我截获到的m通过TranslateMessage(m)被我翻译成为一个Shortcut,然后可以作我想作的事情,可如果如上所示,此时又出现一个MessageBox,那么这个被传递下去的m则这有一个A的消息,而不是Ctrl+A。
    需要的话,我可以把我的整个程序发给你。
      

  2.   

    在MessageBox.Show();后面再将这消息Ctrl+A再次分发,可不可以?
      

  3.   

    记得 API 中有SendMessage函数,c#的message类中好像也有的 ,对吗? 可以使用他来发送,如何?
      

  4.   

    trying……
    最好有具体实现:)
      

  5.   

    其实我不太清楚你的意思我看了你的代码,
    然后,我在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的时候就没有这个问题你说的是不是这样的?
      

  6.   

    大概是这样吧!
    我是在Form2上测试这个的。把光标放在Textbox里面,然后按Ctrl+C,如果弹出MessageBox,则文本框里面会写下一个C,表明传下去的消息只是一个字符。如果没有MessageBox,则按顺序就该传给Menu去响应的。
    我的myToolBar.OnButtonClick是调的Form2里的这个事件响应:
    private void myToolBar1_ButtonClick,用户可以在此设置每个按钮作不同的工作(与Toolbar是一样的),本意是检测用户按下的是哪个按钮的快捷键,就去调用这个按钮该做的事。(这里面就会出现MessageBox或其他模式对话框)这样说明白了么?
      

  7.   

    I'm now trying the method"SendKeys.Send(...)"to send a "Ctrl+C"message,but it cannot be controled well.
      

  8.   

    SendKeys.Send没用的
    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也没关系
      

  9.   

    李兄:
    问题1:这个myToolBar1_ButtonClick应该属于用户使用时设置的东西,我不可能强制用户来写下这些代码。在整个的Test project都仅是为了测试toolbar,可以看成是用户在使用toolbar。而我必须在他使用之前把全部功能已经做好。也就是只能在这个MyToolbar项目中进行更改设置。
    问题2:我不知道mnu.PerformClick()是不是只是针对于激活menuitem,而不会针对系统发出一个消息。正在试验ing……
      

  10.   

    我试过了,PerformClick()方法只能调对应的控件去响应,如果Form上没有menu就不适用了。
    不知道还有没有其他发送消息的方法,寻找…………期待…………
      

  11.   

    up
    up
    up...
    thinking...