有人能指出我正确的方向,能够使用数字键盘上的按键模拟短信风格吗?
我可以让每个数字打印出一个字母,但我不确定如何让我的程序在同一个键上处理与同一个'事件'相同的多个按键(如果再次按下该键,则滚动几个字母)在(例如)2秒的时间内。
我查了多个按键,但总是想出按键组合(ctrl,alt,delete等)。
答案 0 :(得分:5)
您需要一台状态机并计算每个按键的次数以确定该字母。然后将这些字母(使用事件)传递给您应用的其余部分。
聚苯乙烯。您是否注意到数字键盘上的数字与手机上的数字顺序不同? (789是键盘的顶行和手机的底行)
答案 1 :(得分:2)
首先,您需要存储可用的组合:
static char[] num1 = { 'A', 'B', 'C', '1' };
static char[] num2 = { 'D', 'E', 'F', '2' };
// etc...
然后我们制作一个组合字典,映射到产生它们的右键字符:
Dictionary<char, char[]> map = new Dictionary<char, char[]>()
{
{'1', num1},
{'2', num2}
};
要跟踪的一些变量:
char[] curr = null;
char currChar = '-';
int index = 0;
打印功能:
void Print()
{
Console.WriteLine(curr[index]);
}
逻辑:
private void Form1_KeyPress(object sender, KeyPressEventArgs e)
{
if (map.ContainsKey(e.KeyChar))
{
if (curr == null || e.KeyChar != currChar)
{
curr = map[e.KeyChar];
index = 0;
currChar = e.KeyChar;
Print();
}
else
{
++index;
if (index == curr.Length)
index = 0;
Print();
}
}
}
逻辑基本上检查以确保我们的keymap包含有问题的keycode。如果我们没有跟踪任何内容,或者它与我们当前正在跟踪的内容有所不同,请使用该特定地图和第一个索引。
否则,如果是重复按键,请增加索引(如果我们通过结束,则循环回到开头)。