使用按键模拟短信风格输入

时间:2011-10-26 08:57:24

标签: c# keypress

有人能指出我正确的方向,能够使用数字键盘上的按键模拟短信风格吗?

我可以让每个数字打印出一个字母,但我不确定如何让我的程序在同一个键上处理与同一个'事件'相同的多个按键(如果再次按下该键,则滚动几个字母)在(例如)2秒的时间内。

我查了多个按键,但总是想出按键组合(ctrl,alt,delete等)。

2 个答案:

答案 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。如果我们没有跟踪任何内容,或者它与我们当前正在跟踪的内容有所不同,请使用该特定地图和第一个索引。

否则,如果是重复按键,请增加索引(如果我们通过结束,则循环回到开头)。