如何处理同一控件上的快捷键和按住键

时间:2014-04-15 14:16:33

标签: c# winforms keyboard-shortcuts

我的WinForms应用程序(针对NET 3.5)使用我使用ProcessCmdKey处理的键盘快捷键。我也有少量的按键按键。例如,用户按下R键并拖出一个区域,或按住D键暂时显示一些对象。所有这些都与Canvas控件有关。

我一直在通过画布Key_Down和Key_Up事件来处理按住键。

我认为这一切都有效,因为大部分时间已经在代码中存在了一段时间。然而,显而易见的是,新闻和保持行动不稳定且无法保证。

我知道在Key_Down事件之前调用ProcessCmdKey,我可以通过从ProcessCmdKey返回true来处理Key_Down事件以处理快捷方式。据我所知,我无法通过

来阻止Key_Up事件被触发

有时候按下并按住动作然后停止。最可靠的方法是按下修改键。我在与修改键相关的Key_Down和Key_Up事件中有代码,我怀疑它是负责的。

作为替代方案,我尝试了Hans在这个问题的答案中提出的代码:ProcessCmdKey - wait for KeyUp?我让它工作并禁用了Key down和up事件中的代码。由于在Key_Down和Key_Up事件中有代码,因此在按下修饰键后停止了但停止了。删除它似乎让它工作,如果我使用其他键,如F8,我仍然按下按住键仍然失败。

我已经检查过类似问题的其他一些问题:Skipping KeyDown On Override ProcessCmdKey EventHandllerKey Events: ProcessCmdKey

据我所知,我的ProcessCmdKey代码是标准的。我可以提供代码,但我只是在交换机块中处理KeyData并根据我想要的组合进行操作。

Key_Down和Key_Up的代码遵循此模式

private void OnPCanvasKeyDown(object sender, KeyEventArgs e)
{
    if (e.Modifiers == Keys.Control)
    {
        controlDown = true;
        ctrlLabel.Text = "CTRL";
    }
    if (e.KeyCode == Keys.D)
    {
       if (!hiddenObjectsVisible)
       {
            hiddenObjectsVisible = true;
            services.ShowCustomHideObjects();
       }
     }
     OnKeyDown(e);
}

private void OnPCanvasKeyUp(object sender, KeyEventArgs e)
{
  if (e.KeyCode == Keys.ControlKey)
  {
      controlDown = false;
      ctrlLabel.Text = string.Empty;
  }

  if (e.KeyCode == Keys.D)
  {
      hiddenObjectsVisible = false;
      services.HideCustomHideObjects();
  }
   OnKeyUp(e);
}

我尝试将KeyPreview属性设置为true和false。这似乎不会改变行为。

总而言之,我需要在单个画布上同时处理键盘快捷键和按住键。总的来说,我有点工作,但代价是丢失显示用户的代码,当修改键关闭时,现在看起来有点鞭挞。我确信必须有一个更好的方法,但我的想法已经不多了,所以会很感激一些建议。

修改

我现在发现阻止按键的键在某种程度上都是特殊的。 Esc,F1-F2,Home,End,PageUp,PageDown和箭头键。点击其中一个停止按住工作;点击其中一个以使其工作。任何和所有这些键都可以切换按住的工作。

我试图将焦点强加到画布上,但事实并非如此。我试图覆盖IsInputKey,但这不起作用。所以除了知道这些特殊键'

之外,我没有其他的进步

1 个答案:

答案 0 :(得分:0)

我尴尬地回答这个问题。在另一台计算机上测试我的代码后,问题出在键盘上。由于我不理解特殊键的原因'在这台计算机上的键盘上显示负责阻止按下并按住击键。

据我所知,代码很好,所以这里根本没有C#或WinForms问题。