editBox.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.SubItemEditOver);......private void SubItemEditOver(object sender, System.Windows.Forms.KeyPressEventArgs e)
        {
            switch ((int)e.KeyChar)
            {
                case 13:
                    e.Handled = true;
                    break;                case 27:
                    currentListViewItem.SubItems[subItemSelectedIndex].Text = editBox.Text;
                    editBox.Hide();
                    e.Handled = true;
                    break;                default:
                    break;
            }        }==
代码如上:
我在TextBox上(这里的editbox 是 textbox), 自己添加了处理的事件, 当按下Enter/ESC/F1-F12,都没有进入到SubItemEditOver里面来.但a-Z, 0-9 都可以进来. 
这个控件是显示在ListView中的(我的目的是点击一个item,可以编辑它的内容)
同时,放listview的窗体默认按ESC 关闭这个窗体,enter键是执行Ok按键中的操作.注:这个窗体,实际上是mmc中的一个Dialog,做过mmc程序的兄弟,应该知道.请问大家,为什么在keypress中抓不到enter和esc, 难道是mmc的bug?

解决方案 »

  1.   

    keypress只可以响应可视键,比如字母,数字。要抓enter,要在keydown和keyup中。
      

  2.   

    keyup比较好些,放开的时候再触发
      

  3.   

    在平常的窗体里,这样可以捕捉到回车
    麻烦告知MMC是什么呀?
      

  4.   

    谢谢兄弟们先.但是,我把我做好的控件放到一个普通的Application中,进入 debug 状态时,是可以抓到Enter 和 ESC. 
    大家可以自己试试.
      

  5.   

    这是使用了。NET的事件处理进行的,要想处理比较特殊的按键,建议使用消息
    protected override void WndProc(ref Message m)
    {
    base.WndProc (ref m);
    if (m.Msg == win32.WM_PAINT)
    {
    }
    else if (m.Msg ==  win32.WM_HSCROLL || m.Msg == win32.WM_VSCROLL)
    {
    }
    else if (m.Msg == win32.WM_LBUTTONDOWN 
    || m.Msg == win32.WM_RBUTTONDOWN
    || m.Msg == win32.WM_LBUTTONDBLCLK
    )
    {
    }
    else if (m.Msg == win32.WM_MOUSEMOVE )
    {
    }
    }
    类似这样处理。
      

  6.   

    忘记了,win32是这样定义的:
    public class win32
    {
     
    public const int  WM_MOUSEMOVE      =              0x0200;
    public const int  WM_LBUTTONDOWN     =             0x0201;
    public const int  WM_LBUTTONUP       =             0x0202;
    public const int  WM_RBUTTONDOWN     =             0x0204;
    public const int  WM_LBUTTONDBLCLK   =             0x0203;public const int  WM_MOUSELEAVE      =             0x02A3;

    public const int WM_PAINT     =                   0x000F;
    public const int WM_ERASEBKGND   =                0x0014;

    public const int WM_PRINT         =               0x0317; //const int EN_HSCROLL       =   0x0601;
    //const int EN_VSCROLL       =   0x0602; public const int WM_HSCROLL       =              0x0114;
    public const int WM_VSCROLL       =              0x0115;
    public const int EM_GETSEL              = 0x00B0;
    public const int EM_LINEINDEX           = 0x00BB;
    public const int EM_LINEFROMCHAR        = 0x00C9; public const int EM_POSFROMCHAR         = 0x00D6;
    }
    当然,你可以把PostMessage也定义进去。
      

  7.   

    keyup 就有, keypress就是空的
      

  8.   

    private void dataGrid1_KeyUp(object sender, System.Windows.Forms.KeyEventArgs e)
    {
    MessageBox.Show(e.KeyCode.ToString()+" "+e.KeyValue.ToString()+" ");
    }result:
    Enter 13
      

  9.   

    搞定了,原因是因为TextBox这个控件的一个属性 
    AcceptsReturn = true 
    就可以在KeyDown/KeyUp中抓到Enter了. 
    但非常可惜,还是抓不住ESC 键, 因为没有对应的 AcceptsEsc 属性,哈. 一按ESC, 窗体就自动关闭了(设置了CancelButton), 没办法.楼上的兄弟提到了MESSAGE,俺不是很会...... 
    继续奋斗中.
      

  10.   

    刚才又试了一下子.
    在ProcessCmdKey中,有msg 和 keyData两个参数.
    在这个debug, 发现按ESC是可以进来的.
    但是,我处理完之后,return false. 窗体的ESC还是触发了(即窗体还是关闭了) 哪位大大有更好的想法,请指教.谢谢!
      

  11.   

    搞定了.
    ProcessCmdKey 中Return true; 就可以了.
    我是直接 return base.ProcessCmdKey(ref msg, keyData);谢谢大家的帮助.
    谁有操作message的代码,可以分享一下子么?谢谢1
      

  12.   

    KeyPress可以接收到回车键的,且非常有用,普通输入法都是通过回车来清除已有的输入,当用户输入汉字编码,发现打错了,按个回车清除掉,此时的回车,KeyDown或者KeyUp可以收到,KeyPress不能收到,我们要的就是这种效果,因为此时用户并不是要输入回车 ,而是要清除已输入的汉字编码.