【问题】
C#,已经获得某个字符变量的字母,比如’M’,希望将其转换为对应的Key类型的变量,然后复制给另外一个Keys的变量。
【解决过程】
1.网上搜了一下,貌似没多少人遇到此问题。搜到的都是将已获得的key转换为字母的。
2.找到了这个:How do I convert a Char into a Keycode in .Net?,但是添加了代码:
key = VkKeyScan(keyLetter);
结果提示没有这个VkKeyScan函数。官网的解释在这里:VkKeyScan function。
其中说了,此函数在User32.dll中。现在想办法把其添加到当前C#项目中。
3.去C#项目的Reference->Add Reference中没有找到此dll。
后来去搜User32.dll,找到:C#调用Win32 的API函数–User32.dll,然后看到了,原来也是通过DllImport导入对应的dll的,然后折腾了一下,得到了可以工作的代码:
#region User32.dll 函数 …. key = VkKeyScan(keyLetter); |
但是最后,将得到的keyLetter是’M’=77传入进去,返回的key的值却是333,而不是所希望的77,所以,看来还是不能正确转换我所期望的Keys类型的值。
4.参考这里:Convert String to KeyCode,想要去试试Asc,结果发现不存在这个函数,所以放弃此办法。
5.后来发现了,上述VkKeyScan将字符M转换为Keys的结果333,其实对应着十六进制是0x0000014d ,对照着上述官网的解释:
Return value
Type: SHORT
If the function succeeds, the low-order byte of the return value contains the virtual-key code and the high-order byte contains the shift state, which can be a combination of the following flag bits.
Return value
Description
1
Either SHIFT key is pressed.
2
Either CTRL key is pressed.
4
Either ALT key is pressed.
8
The Hankaku key is pressed
16
Reserved (defined by the keyboard layout driver).
32
Reserved (defined by the keyboard layout driver).
其实是333=0x14D,其低字节0x4D=77,对应着字母M,而高字节0x01=1对应着Shift键被按下。
但是此处很奇怪的是,我本身没按Shift,所以用VkKeyScan转换出来的,应该是0x4d=77=字母M,才对的。
不过倒也是实现了所需要的功能,是可以获得对应的M的键值的。
6.但是,突然发现,其实本身,直接使用强制转换,也是可以工作的。而说到直接使用强制转换,之前其实试过了,针对返回的Object,是不能直接转换为Keys类型变量的,而对于字符char类型变量,是可以直接强制转换为Keys类型变量的。
最后代码如下:
Object selectedKey = cmbKeys.Text; char keyLetter = Convert.ToChar(selectedKey); //char 'M' //key = VkKeyScan(keyLetter); //0x0000014d //key = (Keys)selectedKey; // can not work key = (Keys)keyLetter; // can work -> convert char 'M' to Keys.M hook.RegisterHotKey(controlKeys, key);
【总结】
对于将字符,字母,直接转换为枚举的Keys类型变量,不需要使用其他乱七八糟的复杂方法,可以直接通过强制转换来实现:
char keyLetter = ‘M’; Keys key = (Keys)keyLetter; // can work -> convert char ‘M’ to Keys.M |