如何将字符转换为密钥代码?

如何将反斜杠键(’\’)转换为键代码?

在我的键盘上反斜杠代码是220,但方法如下

(int)'\\' 

给我回报92。

我需要一些通用的转换

  int ConvertCharToKeyValue(char c) { // some code here... } 

有任何想法吗?

您可以P / Invoke VkKeyScan()将键入的密钥代码转换回虚拟密钥。 请注意修改键的状态很重要,得到“|” 需要按住键盘布局上的shift键。 你的function签名不允许这样做,所以我只是做了些什么:

  public static Keys ConvertCharToVirtualKey(char ch) { short vkey = VkKeyScan(ch); Keys retval = (Keys)(vkey & 0xff); int modifiers = vkey >> 8; if ((modifiers & 1) != 0) retval |= Keys.Shift; if ((modifiers & 2) != 0) retval |= Keys.Control; if ((modifiers & 4) != 0) retval |= Keys.Alt; return retval; } [System.Runtime.InteropServices.DllImport("user32.dll")] private static extern short VkKeyScan(char ch); 

还要注意需要使用死键(Alt + Gr)生成输入键的键盘布局。 这种代码最好避免使用。

如果

 var char = System.Windows.Forms.Keys.OemPipe; // 220 var code = (int)char; 

然后

 public static int ToKeyValue(this char ch) { return (int)(System.Windows.Forms.Keys)ch; } 

我知道没有一个函数可以将字符映射到虚拟键代码。 但是,您可以使用下表开始构建此类映射。

http://msdn.microsoft.com/en-us/library/dd375731(v=VS.85).aspx 。

请注意,您需要知道键盘,查看您提到的键’\’这是VK_OEM_5虚拟键,对于美国键盘,如果没有移位则为’\’和’|’ 如果移位,那么你的function将需要知道正在使用的键盘。

当然,如果要从虚拟键代码映射到字符,可以使用interop来调用MapVirtualKeyEx函数。

更新根据您的评论,这将为您提供您想要的。

 [DllImport("user32.dll")] static extern int MapVirtualKey(int uCode, uint uMapType); const uint MAPVK_VK_TO_CHAR = 0x02; private void textBox1_KeyDown(object sender, KeyEventArgs e) { int key = MapVirtualKey((int)e.KeyCode, MAPVK_VK_TO_CHAR); if (key == (int)'\\') { } } 

或者你可以保持简单并投下它。

 (Keys)keyToConvert