寻找一个VirtualKey到真正的char转换器功能

时间:2018-12-05 16:21:14

标签: c# keyboard raw-input

我正在寻找一个可以从键盘在RawInput接收一堆VirtualKey的函数。与C#中的键盘记录程序非常相似的软件。以防万一,我搜索了该死的很多东西,什么也找不到。

上下文

  • 要捕获事件,我使用KeyPressed。
  • 要读取VKey值,请从e.KeyPressEvent.VKeyName访问它。
  • 对于字母字符,'A'->'A', 'B'->'B' and so on可以正常工作。
  • 其余字符不会,案例是:
    • 组合键char(这意味着我必须按下键盘上的多个键才能创建它们),例如'@'->'AltGr + 2' or '$'->'Shift+5'
    • 一个简单的数字。每当我按任何数字时:'2' -> 'D2'
    • 当我按下' ' -> SPACE时的特殊字符。

我需要的

每当我按下一个按钮时,我都希望得到它的确切值,而不仅仅是“ SPACE”或“ OEMSEMICOLON”。我需要获取一个值为''或';'的字符或我按的任何方式。

简单代码

private void OnKeyPressed(object sender, RawInputEventArg e)
{
    KeysConverter kc = new KeysConverter();
    string keyChar = kc.ConvertToString(e.KeyPressEvent.VKeyName);
    Console.WriteLine("You pressed: " + e.KeyPressEvent.VKeyName);
}

控制台中的示例

Values I get from keyboard vs values I need in ''

1 个答案:

答案 0 :(得分:1)

具有您所有特点的功能不存在。您必须建立对应表。

简单的方法是使用256个虚拟键码或scancode构建第一个数组或枚举表,而第二个数组为您提供正确的将virtualKey或scancode转换为字符串键的

例如

public enum Key
{
        Escape = 1,
        D1,
        D2,
        D3,
        D4,
        D5,
        D6,
        D7,
        D8,
        D9,
        D0
}


private string[] stringCodeMap = {
            "",   //key = 0,
            "",   //key = 1,
            "1",  //D1 = 2,
            "2",  //D2 = 3,
            "3",  //D3 = 4,
            "4",  //D4 = 5,
            "5",  //D5 = 6,
            "6",  //D6 = 7,
            "7",  //D7 = 8,
            "8",  //D8 = 9,
            "9",  //D9 = 10,
            "0",  //D0 = 11
}

您可以使用:捕获字符串代码,如果scankey是按下键(虚拟键或scancode键)的结果

string skey = stringCodeMap[(int)scankey];

对于按下的多个键,控制,Shift(向左或向右)...都有自己的代码