@ char的密钥代码

时间:2009-12-19 18:40:48

标签: c# .net key keycode

有人可以告诉我@键的标识符吗?

例如keys.Escape用于ESC键。我想知道@

是什么 谢谢。

4 个答案:

答案 0 :(得分:5)

KeyCode 是您在 KeyDown KeyUp 事件中获得的。由于这是一个移位字符,它取决于键盘布局。据我所知,大多数键盘都在数字2之上,这意味着对e.Shift && e.KeyCode == Keys.D2(WinForms)进行了检查。但是在一些大多数国际键盘上,这都行不通。

但请注意,处理 KeyPress 事件更可靠:e.KeyChar == '@'

修改:我快速查看了this page,大多数国际键盘都使用"超过2键,并使用Alt-something获得@

答案 1 :(得分:2)

在我的键盘上是Keys.D2,因为@是与数字2相同的键。

但是,如果您处理KeyPress事件,则会在具有KeyPressEventArgs.KeyChar property的参数中获取KeyPressEventArgs。此属性包含字符而不是键码。

答案 2 :(得分:2)

您不应该使用KeyDown事件来识别类似@的输入键。从虚拟键代码(KeyEventArgs.KeyData)到键入键的转换取决于键盘布局。这在英国可能与美国不同,你可以在某个地方挤压一英镑。在远东地区的键盘上确实有所不同。

改为使用KeyPressed事件。

答案 3 :(得分:0)

首先,您需要一个类来包装检查键盘布局所需的OS调用:

public class KeyboardPointer : IDisposable
{
  [DllImport("user32.dll", CharSet = CharSet.Unicode)]
  static extern short VkKeyScanEx(char ch, IntPtr dwhkl);
  [DllImport("user32.dll")]
  static extern bool UnloadKeyboardLayout(IntPtr hkl);
  [DllImport("user32.dll")]
  static extern IntPtr LoadKeyboardLayout(string pwszKLID, uint Flags);
  private readonly IntPtr pointer;
  public KeyboardPointer(int klid)
  {
    pointer = LoadKeyboardLayout(klid.ToString("X8"), 1);
  }
  public KeyboardPointer(CultureInfo culture)
    :this(culture.KeyboardLayoutId){}
  public void Dispose()
  {
    UnloadKeyboardLayout(pointer);
    GC.SuppressFinalize(this);
  }
  ~KeyboardPointer()
  {
    UnloadKeyboardLayout(pointer);
  }
  public bool GetKey(char character, out Keys key)
  {
    short keyNumber = VkKeyScanEx(character, pointer);
    if(keyNumber == -1)
    {
      key = Keys.None;
      return false;
    }
    key = (System.Windows.Forms.Keys)(((keyNumber & 0xFF00) << 8) | (keyNumber & 0xFF));
    return true;
  }
}

然后如果你跑:

Keys atKey;
bool hasAtKey;
using(var keyboard = new KeyboardPointer(CultureInfo.CurrentCulture))
  hasAtKey = keyboard.GetKey('@', out atKey);
如果键盘具有hasAtKey的组合键,则

@为真,在这种情况下atKey将保留相应的值,否则它将保留Keys.None

例如,当我运行它时,atKey包含值Keys.Oemtilde | Keys.Shift,但如果我更改代码以传入CultureInfo.GetCultureInfo("en-US")它包含Keys.D2 | Keys.Shift

正如您所看到的,KeyboardPointer编写为接受文化和数字ID,因此您不限于文化的主键盘,也包括与其一起使用的其他布局,例如Dvorak布局等。

以上都是使用Windows的调用&#39; User32功能,因此在其他平台上需要另一种方法。