如何使用"空格键或Enter"等键盘键停止按键。 C#

时间:2015-09-28 12:53:48

标签: c#

我有泡沫应用程序有几个按钮。当我运行此应用程序时,我可以使用鼠标单击按下这些按钮,也可以使用键盘按下这些按钮。我不想使用键盘按下这些按钮。

当我点击" Tab"时,我也想停止关注按钮。或箭头键" ^,v,<,>"。

此致

3 个答案:

答案 0 :(得分:4)

取代标准Button,在需要该行为时使用以下内容

public class NonSelectableButton : Button
{
    public NonSelectableButton()
    {
        SetStyle(ControlStyles.Selectable, false);
    }
}

修改 这是一个小测试,证明它正在工作

using System;
using System.Linq;
using System.Windows.Forms;

namespace Samples
{
    public class NonSelectableButton : Button
    {
        public NonSelectableButton()
        {
            SetStyle(ControlStyles.Selectable, false);
        }
    }

    static class Program
    {
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            var form = new Form();
            Control[] controls = { new TextBox(), new TextBox(), };
            Button[] buttons = { new NonSelectableButton { Text = "Prev" }, new NonSelectableButton { Text = "Next" }, };
            foreach (var button in buttons)
                button.Click += (sender, e) => MessageBox.Show("Button " + ((Button)sender).Text + " clicked!");
            int y = 0;
            foreach (var item in controls.Concat(buttons))
            {
                item.Left = 8;
                item.Top = y += 8;
                form.Controls.Add(item);
                y = item.Bottom;
            }
            Application.Run(form);
        }
    }
}

EDIT2::要应用解决方案,您需要执行以下操作:

(1)将新代码文件添加到项目中,将其命名为NonSelectableButton.cs,其中包含以下内容

using System;
using System.Linq;
using System.Windows.Forms;

namespace YourNamespace
{
    public class NonSelectableButton : Button
    {
        public NonSelectableButton()
        {
            SetStyle(ControlStyles.Selectable, false);
        }
    }
}

(2)编译项目
(3)现在,新按钮将出现在控制工具箱中(位于顶部),您可以将其拖到标准按钮的而不是表单上。

答案 1 :(得分:2)

最好的办法是停止响应空格键的所有按钮:

注意:这有点像黑客

将表单的KeyPreview属性设置为true

然后将此代码添加到表单的KeyPress事件:

private void Form1_KeyPress(object sender, KeyPressEventArgs e) 
{
   if (this.ActiveControl is Button
   && e.KeyChar == (char)Keys.Space) 
   {
      var button = this.ActiveControl;
      button.Enabled = false;
      Application.DoEvents();
      button.Enabled = true;
      button.Focus();
   }
}

要阻止控件在标记时获得焦点,只需将按钮的TabStop属性设置为false。

答案 2 :(得分:1)

看起来您在应用我以前的答案时遇到了麻烦。这是使用相同想法的另一种方式:

将新代码文件添加到项目中并将以下代码放入其中(确保将YourNamespace替换为您的代码!)

using System;
using System.Reflection;
using System.Windows.Forms;

namespace YourNamespace
{
    public static class Utils
    {
        private static readonly Action<Control, ControlStyles, bool> SetStyle =
            (Action<Control, ControlStyles, bool>)Delegate.CreateDelegate(typeof(Action<Control, ControlStyles, bool>),
            typeof(Control).GetMethod("SetStyle", BindingFlags.NonPublic | BindingFlags.Instance, null, new[] { typeof(ControlStyles), typeof(bool) }, null));
        public static void DisableSelect(this Control target)
        {
            SetStyle(target, ControlStyles.Selectable, false);
        }
    }
} 

然后在Form Load事件中使用它来获取您需要具有该行为的每个按钮。

例如,如果您的表单包含2个名为btnPrevbtnNext的按钮,请在表单加载事件中包含以下行

btnPrev.DisableSelect();
btnNext.DisableSelect();