1

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

例如 keys.Escape 用于 ESC 键。我想知道它是干什么用的@

谢谢你。

4

4 回答 4

5

KeyCode是您在KeyDownKeyUp事件中得到的。由于这是一个移位字符,它取决于键盘布局。据我所知,大多数键盘都在数字 2 上方,这意味着检查e.Shift && e.KeyCode == Keys.D2(WinForms)。但在一些大多数国际键盘上,这将不起作用。

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

编辑:我快速浏览了这个页面,大多数国际键盘都有"over2键并使用 Alt-something 来获得@.

于 2009-12-19T19:16:28.777 回答
2

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

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

于 2009-12-19T18:47:37.417 回答
2

您不应使用 KeyDown 事件来识别像 @ 这样的键入键。从虚拟键代码 (KeyEventArgs.KeyData) 到键入键的转换取决于键盘布局。这在英国可能与在美国不同,你需要在某个地方挤一磅。在远东地区的键盘上肯定会有所不同。

请改用 KeyPressed 事件。

于 2009-12-19T19:16:37.763 回答
0

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

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包含 value Keys.Oemtilde | Keys.Shift,但如果我更改代码以传递它,CultureInfo.GetCultureInfo("en-US")它包含Keys.D2 | Keys.Shift.

如您所见,KeyboardPointer它被编写为同时接受文化和数字 ID,因此您不仅限于文化的主键盘,还可以使用与它一起使用的其他布局,例如 Dvorak 布局等。

以上都是对 Windows 的 User32 函数的调用,因此在其他平台上将需要另一种方法。

于 2015-05-17T11:34:04.053 回答