C# 使用按键模拟sms样式键入

C# 使用按键模拟sms样式键入,c#,keypress,C#,Keypress,有没有人能告诉我正确的方向,让我能够用数字键盘上的按键来模拟sms风格的打字 我可以让每个数字打印出一个字母,但我不确定如何让我的程序将同一按键上的多个按键视为同一个“事件”(即,如果在(例如)2秒内再次按下按键,则滚动几个字母) 我查找了多个按键,但总是找到组合键(ctrl、alt、delete等)。您需要一个状态机,并计算每个按键上的按键次数以确定字母。然后(使用事件)将这些字母传递到应用程序的其余部分 你注意到数字键盘上的数字顺序与手机上的不同吗?(789是键盘上的顶行,手机上的底行)首先

有没有人能告诉我正确的方向,让我能够用数字键盘上的按键来模拟sms风格的打字

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


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

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


你注意到数字键盘上的数字顺序与手机上的不同吗?(789是键盘上的顶行,手机上的底行)

首先,您需要存储可用的组合:

    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} 
    };
打印功能:

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


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

我想你是指标准手机风格的键盘,在这里你可以按几次键以获得不同的字母?这是一个系统范围的东西,还是仅仅针对您的应用程序?仅针对我的应用程序,它是一个简单的项目电话网络模拟器,我没有注意到,实际上,现在我需要弄清楚是以数字还是物理方式映射它们:)最后一次按键怎么样?你需要某种类型的超时,或者用回车键确认…@Moo Juice在逻辑中添加一个计时器,如果超过2秒没有进一步按键,自动返回乞讨并打印当前信件,这是一件简单的事情吗?@thijs,我不想为他写整件事,只是给他一个工作的起点。有很多东西要添加到这个例子中,这个例子只输出循环的字符。在超时时将它们添加到字符串中非常简单(此时我们将重置什么字符数组/索引等)
    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();
            }
        }
    }