最新消息:20210816 当前crifan.com域名已被污染,为防止失联,请关注(页面右下角的)公众号

【已解决】C#中将字母/字符转换为键盘的key/键值/keycode

C# crifan 9363浏览 0评论

【问题】

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 函数
[DllImport("user32.dll")]
//SHORT WINAPI VkKeyScan(__in  TCHAR ch);
public static extern Keys VkKeyScan(char ch);
#endregion

….

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

转载请注明:在路上 » 【已解决】C#中将字母/字符转换为键盘的key/键值/keycode

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

网友最新评论 (1)

  1. 这种做法是错误的哦,只是刚好大写字母的ascii码和键盘码相同。如果你换成其他的字符,或者小写字符,就会出问题了,例如小写字母'a'会被转换成小键盘的1
    [email protected]11年前 (2013-07-10)回复
85 queries in 0.177 seconds, using 22.07MB memory