将KeyChar转换为Key

时间:2018-01-13 12:58:57

标签: c# windows winforms input

如何将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.

1 个答案:

答案 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 functionSystem.Windows.Forms.Keys值映射到您需要的System.Windows.Input.Key

var pressed_key = KeyInterop.KeyFromVirtualKey((int)key);

但这对于整个角色来说都不是有效的解决方案,更不用说不同的字母了,我认为你真正想做的是订阅KeyDown事件,它会告诉你关键代码是正确的程。