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

标签 c# winforms keyboard-shortcuts

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

我一直在通过 Canvas 的 Key_Down 和 Key_Up 事件处理按住键。

我认为所有这些都有效,因为其中大部分已经在代码中存在了一段时间。然而,很明显,按住操作不稳定且无法保证。

我知道 ProcessCmdKey 在 Key_Down 事件之前被调用,我可以通过从处理快捷方式的 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 代码是标准的。我可以提供代码,但我只是在开关 block 中处理 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。这似乎不会改变行为。

总而言之,我需要在一个 Canvas 上同时处理键盘快捷键和按住键。总的来说,我有点让它工作,但代价是丢失了当修改键按下时向用户显示的代码,现在这一切似乎有点过时了。我确信一定有更好的方法,但我的想法已经用完了,所以希望能得到一些建议。

编辑

我现在发现阻挡 Press 和 Hold 键的键在某些方面都很特殊。 Esc、F1-F2、Home、End、PageUp、PageDown 和箭头键。点击其中之一以停止按住不放的工作;点击其中之一以使其工作。所有这些键都会切换按住的工作方式。

我试过将焦点强制放在 Canvas 上,但事实并非如此。我试图覆盖 IsInputKey 但这不起作用。所以除了知道是这些“特殊 key ”之外,我没有进一步前进

最佳答案

我很尴尬地回答这个问题。在另一台计算机上测试我的代码后,问题出在键盘上。由于我不明白的原因,这台计算机上键盘上的“特殊键”似乎负责阻止捕获按住键击。

据我所知,代码没有问题,因此根本不存在 C# 或 WinForms 问题。

关于c# - 如何处理同一控件上的快捷键和按住键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23086395/

相关文章:

c# - 包含 asp.net 填充的 javascript 文件

c# - StringBuilder.Append 问题

c# - 如何在ListView中选择项目?

winforms - 使用自定义 OnPaint 在 F# 中自定义 Windows.Forms 控件?

visual-studio-code - Visual Studio Code 退出当前或封闭代码块的快捷方式

c++ - Qt Creator 中最有用(高效)的快捷方式

C# WPF - 窗口中的黑线

c# - C# 中的命名约定 - 全局变量

c# - 部署 .NET 应用程序时出现 InvalidDeploymentException 错误

visual-studio-code - 如何使用键盘在 Visual Studio Code 中移动选项卡?