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
,对吗?