none
C# 键盘改键 RRS feed

  • 问题

  • 窗口上有多个textbox,希望在按键盘的F1时,textbox中显示F1,按F2时,显示F2,按字母,显示字母。

    如果 textbox1中设置了F1,那么textbox2中就不能设置F1,只能设置其它。

    这么俩个问题?

    有没用会的大大提示一 下。
    2010年4月28日 8:24

答案

  • 我大概知道楼主要干什么。其实就是想实现如 MAME 模拟器中的设置控制器快捷键的 UI,每个控制器按键不能设置重复的快捷键。

    C# 中有一个 KeyCode 的枚举,键盘按键会触发 KeyDown、KeyPress 以及 KeyUp。在 KeyPress 的处理程序中,用 e.KeyCode 可以得到按键的 ASCII 码。用 e.KeyCode.ToString() 则可以得到按键的名称。如 F1 等。这样第一个问题就解决了。

    至于第二个问题,用一个 List<int> 存放所有 TextBox 的按键。每当有 KeyPress 时,把当前的按键码加到这个里面去;加进去之前利用 List<>.Contains(e.KeyCode) 检查一下有没有,有,表示重复按键,设置 e.Handled = true,否则,加进去。


    Mark Zhou
    2010年4月28日 10:08
  • 你好!

         我同意Mazhou的解决方法,这样性能会好很多,实际上无需判断所有的键的,他在TextBox1的KeyDown事件中把这个输入记录下来,然后如果他想在TextBox2 中输入这个按键,直接屏蔽他的输入!

         补充一点,如果你的输入只是字符键,可以使用KeyPress,如果需要非字符键,那必须使用KeyDown了,非字符键不能出发KeyPress


    周雪峰
    • 已标记为答案 Csharpzero 2010年4月29日 3:59
    2010年4月28日 13:45
    版主

全部回复

  • 我重复下你的问题:

    1)Form中有多个textbox;

    2)每个textbox仅显示固定的字符,如“F2”或者“F1”,不能同时为“F1”和“F2”;

    3)textbox相应的输出,即textBox.Text的值应该是你所摁下键盘上所标的值。

    若是的话,问题可如下解决:

    1)将每个textBox绑定到固定的,你所想要的键,即只有当摁下某键(eg."F1")时才响应;

    2)键盘对应的值是ASCII码,因此你可以将确定的ASCII码与其对应的值联系到一起,每次摁下键时检查其ASCII值然后显示对应的键盘值。

    2010年4月28日 8:49
  • 不是固定的字符,是键盘上的所有值 。要怎么做啊?

     

    2010年4月28日 9:10
  • 依然是相同的解法,比如说在textBox1中设置了F1, F2, F2, F3。 然后在textBox2中设置了其他的比如说A, B, C,可如下伪代码:

    switch (Console.ReadKey().KeyChar)
          {
            case 'F1'.ASCII:
               'F2'.ASCII:
               'F3'.ASCII:
               textBox1.Text = 当前的键盘值;
              break;
              ...
          }
    2010年4月28日 9:31
  • 我大概知道楼主要干什么。其实就是想实现如 MAME 模拟器中的设置控制器快捷键的 UI,每个控制器按键不能设置重复的快捷键。

    C# 中有一个 KeyCode 的枚举,键盘按键会触发 KeyDown、KeyPress 以及 KeyUp。在 KeyPress 的处理程序中,用 e.KeyCode 可以得到按键的 ASCII 码。用 e.KeyCode.ToString() 则可以得到按键的名称。如 F1 等。这样第一个问题就解决了。

    至于第二个问题,用一个 List<int> 存放所有 TextBox 的按键。每当有 KeyPress 时,把当前的按键码加到这个里面去;加进去之前利用 List<>.Contains(e.KeyCode) 检查一下有没有,有,表示重复按键,设置 e.Handled = true,否则,加进去。


    Mark Zhou
    2010年4月28日 10:08
  • 你好!

         我同意Mazhou的解决方法,这样性能会好很多,实际上无需判断所有的键的,他在TextBox1的KeyDown事件中把这个输入记录下来,然后如果他想在TextBox2 中输入这个按键,直接屏蔽他的输入!

         补充一点,如果你的输入只是字符键,可以使用KeyPress,如果需要非字符键,那必须使用KeyDown了,非字符键不能出发KeyPress


    周雪峰
    • 已标记为答案 Csharpzero 2010年4月29日 3:59
    2010年4月28日 13:45
    版主
  • 终于有人理解我了。。

    感谢

    mazhou,    

      周雪峰

    努力进行中。。。



    2010年4月29日 3:58
  • 不客气啊!
    周雪峰
    2010年4月29日 11:44
    版主