有人可以告诉我@键的标识符吗?
例如 keys.Escape 用于 ESC 键。我想知道它是干什么用的@
谢谢你。
KeyCode是您在KeyDown和KeyUp事件中得到的。由于这是一个移位字符,它取决于键盘布局。据我所知,大多数键盘都在数字 2 上方,这意味着检查e.Shift && e.KeyCode == Keys.D2
(WinForms)。但在一些大多数国际键盘上,这将不起作用。
但请注意,处理KeyPress事件要可靠得多:e.KeyChar == '@'
编辑:我快速浏览了这个页面,大多数国际键盘都有"
over2
键并使用 Alt-something 来获得@
.
在我的键盘上,它是 Keys.D2,因为 @ 与数字 2 是同一个键。
但是,如果您处理 KeyPress 事件,则会在具有KeyPressEventArgs.KeyChar 属性的参数中获得 KeyPressEventArgs 。而且这个属性包含一个字符而不是键码。
您不应使用 KeyDown 事件来识别像 @ 这样的键入键。从虚拟键代码 (KeyEventArgs.KeyData) 到键入键的转换取决于键盘布局。这在英国可能与在美国不同,你需要在某个地方挤一磅。在远东地区的键盘上肯定会有所不同。
请改用 KeyPressed 事件。
首先,您需要一个类来包装检查键盘布局所需的操作系统调用:
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 函数的调用,因此在其他平台上将需要另一种方法。