DirectInput密钥代码 - 十六进制字符串到简短

时间:2018-02-16 23:15:46

标签: c# string hex short directinput

我有一个包含所有字母及其DirectInput密钥代码的2D数组:

string[,] DXKeyCodes = new string[,]
{
    {"a","0x1E"},
    {"b","0x30"},
    ...
};

然后我有一个函数,如果我发送' a'它返回' 0x1E'。

然后,通过一个需要将密钥代码指定为short的函数将此密钥代码作为按键发送到外部程序,但是我的数组包含字符串。

如何将此类字符串转换为简短字符串?

例如,这是有效的,但当然总是发送相同的密钥代码:

Send_Key(0x24, 0x0008);

我需要这样的东西才能工作,所以我可以发送任何给定的密钥代码:

Send_Key(keycode, 0x0008);

我尝试过以下内容,但它也无效,只是崩溃了我的应用程序。

Send_Key(Convert.ToInt16(keycode), 0x0008);

我真的不想去像

这样的东西
if (keycode == "a")
{  
    Send_Key(0x1E, 0x0008);
}
else if (keycode == "b")
{  
    Send_Key(0x30, 0x0008);
}
...

我确信有更好的方法,但我无法找到它:(

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

如问题评论中的theme86和Jasen所述,您应该使用a Dictionary<string, short> instead of a 2D array。这样,您可以通过键来查找值(而不是在想要查找相应值时迭代遍历数组搜索键),并且您不必从字符串进行任何转换。如,

Dictionary<string, short> DXKeyCodes = new Dictionary<string,short>
{
  {"a", 0x1E},
  {"b", 0x30}
};
short theValue = DXKeyCodes["a"]; // don't need to loop over DXKeyCodes
                                  // don't need to convert from string

如果出于某种原因你必须将这些值存储为字符串,那么使用静态方法Convert.ToInt16(string, int)

short convertedValue = Convert.ToInt16("0x30", 16);

(在C#中,shortSystem.Int16的别名,并且总是有16位。)

答案 1 :(得分:1)

根据DirectInput文档,API有一个Key enumeration

因此,您可以像这样填充dictionary

var DXKeyCodes = new Dictionary<string,short>
{
   { "a", (short)Microsoft.DirectX.DirectInput.Key.A }, // enum value of A is 30 which == 0x1E
   { "b", (short)Microsoft.DirectX.DirectInput.Key.B }
};

用法:

Send_Key(DXKeyCodes[keycode], 0x0008);