【问题标题】:Prevent button from being focused by arrow key click防止按钮被箭头键单击聚焦
【发布时间】:2022-02-08 06:46:22
【问题描述】:

如果用户按下其中一个箭头键,如何防止表单上的按钮被聚焦?
我正在编写一个小游戏,所以这会阻止用户移动。很抱歉解释模糊。

编辑:

玩家是PictureBox,其中有一个图形被移动:

private async void Form1_KeyDown(object sender, KeyEventArgs e)

【问题讨论】:

  • 按钮是否应该被聚焦?即,您是否希望焦点始终停留在表单上而不是任何按钮上?
  • @IvanStoev Jup,这是我的期望,但你应该仍然可以随时按下它们。

标签: c# winforms


【解决方案1】:

在您的Form.cs 中覆盖ProcessCmdKey,如下所示:

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
     if (!msg.HWnd.Equals(Handle) &&
         (keyData == Keys.Left || keyData == Keys.Right ||
          keyData == Keys.Up || keyData == Keys.Down))
          return true;
     return base.ProcessCmdKey(ref msg, keyData);
}

【讨论】:

  • 这是 WM_GETDLGCODE 的 WinForms 等价物吗?是这样,我由衷地赞同。
【解决方案2】:

处理这种情况的一种方法是设置form.KeyPreview = true(参见MSDN),然后在 KeyPress / KeyDown 事件处理程序中处理键:

引用 MSDN 的 KeyPress 事件:

若要仅在表单级别处理键盘事件而不使其他控件接收键盘事件,请将 表单的 KeyPress 中的 KeyPressEventArgs.Handled 属性 事件处理方法为真。

在您的 keysEvent 中测试箭头,以您需要的方式管理它们并设置 Handled=true 以避免默认行为(将焦点移至下一个控件)

【讨论】:

  • 不,不会工作。现在它已经让按钮从一开始就被聚焦了。
【解决方案3】:

对我有用的是将按钮属性“TabStop”设置为 false,您还可以使用表单上控件的 TabIndex 属性从技术上设置表单加载时的焦点。

TabStop - 设置按 TAB 是否可以设置/赋予控件焦点,当按 TAB 键时,它将根据 - TabIndex - 指示接下来将获得焦点的控件。

所以如果按钮 A 的 tabIndex 为 1,按钮 B 的 tabIndex 为 2,按钮 C 的 tabIndex 为 3,但按钮 B 的 tabStop = false,那么按 TAB 将从按钮 A 转到按钮 C,它将跳过按钮 B。

-请记住,并非所有控件似乎都具有“TabStop”属性,我注意到文本框、按钮和 datagridview 确实具有该属性,但标签、组框和图片框之类的东西没有 TabStop,只有 TabIndex。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-23
    • 2014-11-16
    • 2020-02-20
    • 1970-01-01
    • 2012-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多