有人可以告诉我@键的标识符吗?
例如keys.Escape用于ESC键。我想知道@
是什么 谢谢。答案 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功能,因此在其他平台上需要另一种方法。