【问题标题】:Stop a key from firing an event in C# using ProcessCmdKey?使用 ProcessCmdKey 阻止键在 C# 中触发事件?
【发布时间】:2013-08-21 20:13:11
【问题描述】:

所以我正在制作一个表格,我希望左右键仅对应于表格上的 numericUpDown 框。所以我写的代码如下:

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
    {
         if (keyData == Keys.Right)
        {

            numericUpDown1.Value = Convert.ToDecimal(numericUpDown1.Value + 1);
        }
         if (keyData == Keys.Left)
        {
            try
            {
                numericUpDown1.Value = Convert.ToDecimal(numericUpDown1.Value - 1);
            }
            catch { }
        }
        return base.ProcessCmdKey(ref msg, keyData);
    }

但是,如果这是当前所选视图的内容,它似乎仍会执行在表单上不同对象之间移动的默认操作。如何停止默认操作?

【问题讨论】:

  • 您是否尝试过“返回真”?对于您不想继续处理的情况?
  • 您的代码甚至无法编译。您在应该返回布尔值的方法中没有返回语句。
  • 不,我没有返回 true...这似乎在大多数情况下都有效(除非我非常快速地按下按键)...但这不会破坏表格,所以我如果有人决定偶尔这样做,我可以接受。谢谢!
  • @user2678856 如果返回 true 有效,您能否将其标记为答案?

标签: c# winforms keypress


【解决方案1】:

不希望执行默认操作时需要返回true。

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
     if (keyData == Keys.Right)
    {

        numericUpDown1.Value = Convert.ToDecimal(numericUpDown1.Value + 1);
        return true;
    }
     if (keyData == Keys.Left)
    {
        try
        {
            numericUpDown1.Value = Convert.ToDecimal(numericUpDown1.Value - 1);
            return true;
        }
        catch { }
    }
}

【讨论】:

    【解决方案2】:

    也许你应该返回 true 来表明你已经处理了击键消息,这样其他控件就不会得到它了。

    【讨论】:

      【解决方案3】:
      protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
      {
           if (keyData == Keys.Right){
              numericUpDown1.Value = Convert.ToDecimal(numericUpDown1.Value + 1);
              return true;
           }
           else if (keyData == Keys.Left){
              try {
                  numericUpDown1.Value = Convert.ToDecimal(numericUpDown1.Value - 1);              
              }
              catch { }
              return true;
          }        
          return base.ProcessCmdKey(ref msg, keyData);
      }
      

      注意:您似乎没有发布您运行的代码?我强烈建议您发布您的实际代码,您的代码甚至无法编译,因为缺少return。而且您的代码缺少处理其他密钥所需的return base.ProcessCmdKey(ref msg, keyData);

      【讨论】:

        【解决方案4】:

        您可以添加一个事件处理程序并执行以下操作:

        private void keypressed(Object o, KeyPressEventArgs e)
        {
            if (e.KeyCode == Keys.Right || e.KeyCode == Keys.Left)
            {
        
                e.Handled = true; //this line will do the trick
                //add the rest of your code here. 
        
            }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-11-25
          • 1970-01-01
          • 1970-01-01
          • 2021-04-22
          • 1970-01-01
          相关资源
          最近更新 更多