【问题标题】:Simulating sms style typing using keypress使用按键模拟短信风格打字
【发布时间】:2011-12-15 13:57:33
【问题描述】:

谁能指出我正确的方向,以便能够使用数字键盘上的按键来模拟短信风格的打字?

我可以让每个数字打印出一个字母,但我不确定如何让我的程序将同一个键上的多次按键视为同一个“事件”(即,如果再次按下该键,则滚动几个字母在(例如)2 秒内)。

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

【问题讨论】:

  • 我认为您的意思是标准的电话式键盘,您可以按几次键以获取不同的字母?这是系统范围的事情,还是仅适用于您的应用程序?
  • 只是为了我的应用,一个项目的简单电话网络模拟器

标签: c# keypress


【解决方案1】:

您需要一个状态机并计算每个键的按下次数以确定字母。然后将这些字母(使用事件)传递给应用程序的其余部分。

附言。您是否注意到数字键盘上的数字与手机上的数字顺序不同? (789 是键盘的顶行和手机的底行)

【讨论】:

  • 其实我没有注意到,现在我需要弄清楚是数字映射还是物理映射:)
【解决方案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();
            }
        }
    }

逻辑基本上检查以确保我们的键映射包含有问题的键码。如果我们没有跟踪任何内容,或者它与我们当前正在跟踪的不同,请使用该特定地图和第一个索引。

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

【讨论】:

  • 最后一次按键呢?您需要某种超时,或使用 Enter 确认...
  • @Moo-Juice 在逻辑中添加一个计时器以在超过 2 秒没有进一步按键的情况下自动返回开头并打印当前字母会很简单吗?
  • @thijs,我不想为他写完整的东西,而只是给他一个工作的起点。有很多东西要添加,这个例子只是在字符循环时输出字符。在超时时将它们添加到字符串中非常简单(此时我们将重置什么字符数组/索引等)
猜你喜欢
  • 1970-01-01
  • 2016-03-05
  • 1970-01-01
  • 2012-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-18
  • 1970-01-01
相关资源
最近更新 更多