【问题标题】:How to convert a character to key code?如何将字符转换为键码?
【发布时间】:2011-02-23 08:05:18
【问题描述】:

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

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

(int)'\\'

返回 92。

我需要一些通用的转换,比如

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

有什么想法吗?

【问题讨论】:

  • 你看到这个答案了吗? stackoverflow.com/questions/318777/…
  • 是的。我需要从char转换为int。我需要一个独立于平台的解决方案。没有 WM_Messages...
  • 我似乎相信没有这样的“独立于平台”的键盘修改。考虑 Mac 键盘没有 Windows 键,而 Windows 键盘没有 Command 键。 Linux 本身两者都没有。这三个都可以并且确实可以识别其他键,但是映射并不一致。还是您忽略了应用程序中的修饰符?这可能会带来其他困难。 〜但是,一如既往,我的理解可能是错误的。 YMMV。 HTTH。
  • 你有没有成功解决过这个问题?您还需要这方面的帮助吗?

标签: c# .net


【解决方案1】:

您可以 P/Invoke VkKeyScan() 将打字键代码转换回虚拟键。注意修饰键状态很重要,获取“|”需要在我的键盘布局上按住 shift 键。您的函数签名不允许这样做,所以我只是编造了一些东西:

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) 来生成键入键的键盘布局。这种代码真的最好避免。

【讨论】:

  • 为我工作,美式键盘,Windows 10,C# Windows.Forms 应用程序
【解决方案2】:

如果

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;
}

【讨论】:

  • 我的印象是OemPipe 会是|OemBackslash 会是`\`
  • @R. Bemrose:是的。但是当我在键盘上按“\”(在 Backspace 和 Enter 上方)时,我的测试文本框会触发 KeyUp 事件,其中 OP 正在寻找 KeyCode = 220
【解决方案3】:

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

(Keys)keyToConvert

【讨论】:

    【解决方案4】:

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

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

    请注意,您需要了解键盘,查看您提到的键“\”,这是 VK_OEM_5 虚拟键,对于美国键盘,如果不移动,则为“\”和“|”如果移位,那么您的函数也需要知道正在使用的键盘。

    当然,如果你想从一个虚拟键码映射到一个字符,你可以使用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)'\\')
      {
    
      }
    }
    

    【讨论】:

    • 感谢您的链接。我读到: VK_OEM_5: 0xDC: 220 用于杂项字符;它可能因键盘而异。 ~~~~~~~~~~~~~~~~~~~~~~~ 对于美国标准键盘,'\|'关键我需要独立于键盘的解决方案。可能最好的解决方案是这样的: public void TextBox_KeyDown(object sender, KeyEventArgs e) { if ((String.Parse(e.KeyCode).EndsWith("\\"))... }
    • @Murat,没有 String.Parse() 函数。我添加了一个示例,它应该有助于您在这里似乎想要做的事情。
    猜你喜欢
    • 1970-01-01
    • 2011-09-28
    • 1970-01-01
    • 1970-01-01
    • 2012-04-26
    • 2010-09-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多