Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将中的字符转换为等效的System.Windows.Input.Key枚举值?_C#_.net_Enums_Input_Key - Fatal编程技术网

C# 如何将中的字符转换为等效的System.Windows.Input.Key枚举值?

C# 如何将中的字符转换为等效的System.Windows.Input.Key枚举值?,c#,.net,enums,input,key,C#,.net,Enums,Input,Key,我想写一个这样的函数 public System.Windows.Input.Key ResolveKey(char charToResolve) { // Code goes here, that resolves the charToResolve // in to the Key enumerated value // (For example with '.' as the chara

我想写一个这样的函数

        public System.Windows.Input.Key ResolveKey(char charToResolve)
        {
            // Code goes here, that resolves the charToResolve
            // in to the Key enumerated value
            // (For example with '.' as the character for Key.OemPeriod)

        }
我知道我可以写一个巨大的开关盒来匹配角色,但是还有其他方法吗? 问题是键enum的字符串可能与字符不匹配,因此enum.IsDefined将无法工作

有什么想法吗


更新:这是在Windows环境中

尝试使用System.Windows.Input.KeyConverter类的ConvertFrom方法。

只需按以下方式进行转换:

[DllImport("user32.dll")]
static extern short VkKeyScan(char ch);

static public Key ResolveKey(char charToResolve)
{
    return KeyInterop.KeyFromVirtualKey(VkKeyScan(charToResolve));
}
Dim KeyConverter作为新形式。KeyConverter
Dim S As String=KeyConverter.ConvertToString(如键)
Dim O As System.Windows.Forms.Keys=KeyConverter.CONVERTFORM
Dim ChValue As Integer=CType(O,整数)
在我的情况下,我按键盘上的“回车键,
O
进入
ENTER{13}
,ChValue进入字符代码
13
例如,对于
选项卡
键,我将通过这种方式接收字符代码
9

最近我发现了一种可以处理控制键状态的强大工具:

用一个示例程序解释这一点可能比用一个示例程序解释更容易 还有什么:

名称空间键查找器
{
班级计划
{
[DllImport(“user32.dll”,CharSet=CharSet.Unicode)]
静态外部短VkKeyScanEx(字符ch、IntPtr dwhkl);
[DllImport(“user32.dll”)]
静态外部键盘布局(IntPtr hkl);
[DllImport(“user32.dll”)]
静态外部IntPtr加载键盘布局(字符串pwszKLID、uint标志);
公共类键盘指针:IDisposable
{
私有只读IntPtr指针;
公用键盘指针(int-klid)
{
指针=加载键盘布局(klid.ToString(“X8”),1);
}
公用键盘指针(CultureInfo区域性)
:this(culture.KeyboardLayoutId){}
公共空间处置()
{
解锁键盘布局(指针);
总干事(本);
}
~KeyboardPointer()
{
解锁键盘布局(指针);
}
//在此处转换为System.Windows.Forms.Key,但
//类似任务的其他一些枚举具有相同的属性
//到基础Windows API值的一对一映射
公共bool GetKey(字符,out key)
{
short keyNumber=VkKeyScanEx(字符、指针);
如果(键号==-1)
{
key=System.Windows.Forms.Keys.None;
返回false;
}
key=(System.Windows.Forms.Keys)((keyNumber&0xFF00)CultureInfo.GetCultureInfo(代码)))
{
Console.WriteLine(culture.Name);
使用(var键盘=新键盘指针(区域性))
foreach(testChars中的字符测试)
{
控制台。写入(测试);
Console.Write('\t');
if(keyboard.GetKey(测试,输出键))
控制台写入线(描述键(key));
其他的
控制台。写入线(“无键”);
}
}
Console.Read();//停止关闭窗口
}
}
}
输出:

he-IL
转变:转变
没有钥匙
שA
恩美
转变:转变
没有钥匙
ש无钥匙
恩尼
转变:转变
控制:Alt:E
ש无钥匙
(尽管您自己的控制台可能会因以下情况而出现混乱:ש和/或ש 设置和字体)


阅读

什么是环境?winforms/asp.net?这样做的目的是什么?这不是用来这样做的。在Reflector中查看一下它,您会发现它只支持字母、数字和一些其他键。值得注意的例外包括?,它需要是字符串“OemQuestion”正确转换。
VkKeyScan()
使用高字节编码修改器键状态,因此对于大写字母,此操作失败,因为
VkKeyScan()
添加了移位标志。如果使用
0xFF
清除这些标志将使用大写字母。需要使用
设置
哪个命名空间/类?可能需要引用
WindowsBase.dll
,并使用
System.Windows.Input
,对吗?