在winforms里,只响应ctrl键,如下代码,没有任何反应:
//重写ProcessCmdKey方法   
protected override bool ProcessCmdKey(ref   Message msg, Keys e)
{
    if (e == Keys.Control || e == Keys.ControlKey)
    {
MessageBox.Show("ctrl被按下");
    }
    return true;
}于是测试一下按下ctrl键后e收到的是什么,同时看一下 Keys.Control 和 Keys.ControlKey分别是什么
//重写ProcessCmdKey方法   
protected override bool ProcessCmdKey(ref   Message msg, Keys e)
{
    MessageBox.Show("你按下的键是:" + e + " 代码是:" + (int)e + "\n" 
    + "Control键是:" + Keys.Control + " 代码是:" + (int)Keys.Control +"\n"
    + "ControlKey键是:" + Keys.ControlKey + " 代码是:" + (int)Keys.ControlKey
    );
    if (e == Keys.Control || e == Keys.ControlKey)
    {
MessageBox.Show("ctrl被按下");
    }
    return true;
}结果如下图,按下ctrl键的时候,竟然是相当于同时按下了Keys.Control 和 Keys.ControlKey,键代码也是两个之和,现在可以用如下代码来响应ctrl键:
//重写ProcessCmdKey方法   
protected override bool ProcessCmdKey(ref   Message msg, Keys e)
{
    if ((int)e == ((int)Keys.Control + (int)Keys.ControlKey))
    {
MessageBox.Show("ctrl被按下");
    }
    return true;
}谁能解释一下原因,同时shift和alt也有同样的问题。

解决方案 »

  1.   

    试试下面的代码        protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
            {
                if ((keyData & Keys.Control) == Keys.Control)
                {
                    MessageBox.Show("Control key pressed!");
                }            return base.ProcessCmdKey(ref msg,keyData);
            }
      

  2.   

    Keys是一个Flag,他是按位操作的,你想从keydata当中取你想要的Keys的时候,必须通过&操作符。
    另外,.net framework对Keys的ToString()方法貌似实现有问题,往往看到的跟实际期望的不一致,不要参考那个ToString。你要判断组合键的话就写下面的Code:        protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
            {
                if ((keyData & Keys.Control) == Keys.Control && (keyData & Keys.Shift) == Keys.Shift && (keyData & Keys.A) == Keys.A)
                {
                    MessageBox.Show("Control + Shift + A");
                }            return base.ProcessCmdKey(ref msg, keyData);
            }
      

  3.   

    太感谢了!
    还有一个问题,为什么在一个空窗体上响应ctrl或者普通键都没问题,但是我在窗体上加了一个button之后就不能不能响应了。在KeyDown事件中怎么响应多键按下
            private void Form1_KeyDown(object sender, KeyEventArgs e)
            {
                if (e.Control)
                {
                    MessageBox.Show("ctrl");
                }
                else if (e.KeyCode == Keys.A)
                {
                    MessageBox.Show("A");
                }
                else if (e.Control && e.KeyCode == Keys.A)
                {
                    MessageBox.Show("ctrl+A");
                }        }
      

  4.   

    因为Button把输入焦点(Focus)抢占了,Form被Show之后,会将输入焦点设置给Button,这时候,你触发的鼠标键盘消息被Button处理,你会发现如果挂Button.KeyDown事件,就会响应了。
    多键处理你就这样写:        private void Form1_KeyDown(object sender, KeyEventArgs e)
            {
                if ((e.Modifiers & Keys.Control) == Keys.Control && (e.KeyData& Keys.A)== Keys.A&&(e.KeyData& Keys.S)== Keys.S)
                {
                    MessageBox.Show("Contrl + A + S");
                }
            }