如何将KeyPressEventArgs.KeyChar
转换为Key
?
投射不起作用......见:
private void textBox_console_KeyPress(object sender, KeyPressEventArgs e)
{
var key_char = e.KeyChar.ToLower(); //w
var pressed_key = (Key)(key_char); //RightCtrl
var key_check = Keyboard.IsKeyDown(pressed_key);
}
如果在此示例中,我按w
,其值为119,key_check
将为false
,因为(Key)(e.KeyChar)
将评估为RightCtrl
。
我需要将e.KeyChar
转换为System.Windows.Input.Key.W
,其值为66.
答案 0 :(得分:0)
您可以利用Keys
枚举的the lower word对密码进行编码的事实,该密钥代码设计为与大写字母的ASCII字符代码相对应。
例如,Keys.A
的值为0x41(十进制65),即(char)'A'
。
基本上,你可以这样做:
var key = (Keys)e.KeyChar.ToUpper();
适用于未经修饰的非重音拉丁字母。对于数字,您必须决定是否要映射回小键盘键或水平排列键。后者也映射到它们的ASCII码,例如Keys.D0
是0x30,小数48,(char)'0'
。
您还可以确定keychar是小写还是大写,并将其编码到键码修饰符的移位位中:
if(Char.IsUpper(e.KeyChar)) key |= Keys.Shift
最后,根据this answer使用this function将System.Windows.Forms.Keys
值映射到您需要的System.Windows.Input.Key
:
var pressed_key = KeyInterop.KeyFromVirtualKey((int)key);
但这对于整个角色来说都不是有效的解决方案,更不用说不同的字母了,我认为你真正想做的是订阅KeyDown
事件,它会告诉你关键代码是正确的程。