如下:
private void mainFrm_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
{
Console.WriteLine(e.KeyCode);
}
此时用了mainFrm.preview=true就可以工作,如按-->键能打出“Right";问题是:如果mainform上
有了一个button之类的东东,按方向键就不能打出"left","right"等了,按回车也不能打出”enter"
但其它的可以,如按k鍵打出“K”。我估计是keydown消息被button等获取了,但此时如何设定才能得到我要的“left","enter"呢?

解决方案 »

  1.   

    private void button1_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
    {
    Console.WriteLine(e.KeyCode);
    }
      

  2.   

    10分5分有什么好心痛的,我昨天给顶贴的都1人5分拉自己已经解决的问题因为发现别人的代码比我的好,所以本来20分的铁都加到了60。值就行,分别太在意罗。焦点在什么地方,keydown就是谁的,你如果默认在按钮上,当然就是按钮的。点一下窗体的空白位置
    看看是不是就可以了?以上2句猜测而已,本人也不是很清楚,说错别扔东西阿。
      

  3.   

    很奇怪的说,我刚才试了一下。的确,在Form.KeyPreview = true的时候,“Left","Right","Up","Down"
    的事件好像被Button拦截。可是根据msdn的说明:当此属性设置为 true 时,窗体将接收所有 KeyPress、KeyDown 和 KeyUp 事件。
                                    ************************************ 
    在窗体的事件处理程序处理完该击键后,然后将该击键分配给具有焦点的控件很是不理解阿。
      

  4.   

    不仅窗体抓不到“Left","Right","Up","Down","Enter" KeyDown事件。连这个Button也没有抓到。AcceptButton设没设都没有影响。测试代码如下:
    private void Form1_KeyDown(object sender, KeyEventArgs e)
    {
    MessageBox.Show( sender.GetType().Name );
    switch( e.KeyCode )
    {
    case Keys.Right:
    MessageBox.Show("Right");
    break;
    case Keys.Left:
    MessageBox.Show("Left");
    break;
    case Keys.Up:
    MessageBox.Show("Up");
    break;
    case Keys.Down:
    MessageBox.Show("Down");
    break;
    default:
    break;
    }
    } private void button1_KeyDown(object sender, KeyEventArgs e)
    {
    MessageBox.Show( sender.GetType().Name );
    switch( e.KeyCode )
    {
    case Keys.Right:
    MessageBox.Show("Right");
    break;
    case Keys.Left:
    MessageBox.Show("Left");
    break;
    case Keys.Up:
    MessageBox.Show("Up");
    break;
    case Keys.Down:
    MessageBox.Show("Down");
    break;
    default:
    break;
    }
    }
      

  5.   

    仔细看了下msdn终于找到原因:
    键事件按下列顺序发生: KeyDown 
    KeyPress 
    KeyUp 
    要仅在窗体级别处理键盘事件并且不允许其他控件接收键盘事件,请将窗体的 KeyPress 事件处理方法中的 KeyPressEventArgs.Handled 属性设置为 true。某些键,如 TAB、RETURN、ESCAPE 和箭头键,由控件自动处理。为使这些键引发 KeyDown 事件,必须在窗体上的每个控件中重写 IsInputKey 方法。用于重写 IsInputKey 的代码需要确定是否按下了某一个特殊键,并且需要返回一个 true 值。有关处理事件的详细信息,请参见使用事件。
      

  6.   

    fangxinggood:
      是不是这样加呀,我试了不行,是我没明白你的意思?
      private void mainFrm_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
    {
    Console.WriteLine(e.KeyCode);
                  //这样加吗?
                   e.Handled=true;
    }
      

  7.   

    我以试了:
    private void mainFrm_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e)
    {
    e.Handled=true;
    Console.WriteLine(e.KeyChar );
    } private void mainFrm_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
    {
    Console.WriteLine(e.KeyCode);
    }
    还是不行
      

  8.   

    Enter可以吧.只是方向键不行,因为方向键被按钮接管了...因为在按钮上,方向键用来移动焦点...你可以使用 WndPorc来消息进行处理...其实,分能做什么,谁也不是冲着分来回答问题的.
      

  9.   

    现在问题是我必须让mainform得到left,right,down按下的消息,以实现类似以下代码:
       swich (e.KeyCoke)
             case 'left': ...
             case 'right':...
             ...
    而不原用button得到的此消息,因我担心万一某时此buuton没有焦点岂不麻烦。
    望指点
      

  10.   

    用wndProc来实现,能给点例子吗? 还有,按空格键为啥当前缺省焦点按钮的click事件被激活呢,我如何能让他不这样自作多情?