Я фиксирую ключи на своей WinForm, но я пытаюсь увидеть, является ли нажатая клавиша «Строка» - получить исключение - PullRequest
0 голосов
/ 28 апреля 2010

Вот мой код:

        void gkh_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == neededLetter as Keys)
            {
                if (neededLetter == "n")
                {
                    neededLetter = "o";
                }
                else if (neededLetter == "o")
                {
                    neededLetter = "t";
                }
                else if (neededLetter == "t")
                {
                    neededLetter = "e";
                }
                else if (neededLetter == "e")
                {
                    this.Show();
                }
            }
            else
            { 
                neededLetter = "n";
            }
        }

Я получаю сообщение об ошибке в первом блоке If:

Оператор as должен использоваться с ссылочный тип или обнуляемый тип

Редактировать: Для ясности:

Пользователь нажимает клавишу, и компьютер сравнивает этот e.Keycode со строковой переменной, для которой установлена ​​буква «n». Если true, установите для переменной requiredLetter значение «o».

После этого, когда пользователь нажал другую клавишу, если это «o», сохраните необходимую букву в «t». и так далее и тому подобное.

Ответы [ 3 ]

0 голосов
/ 28 апреля 2010

Используйте это:

if (e.KeyCode == (Keys)neededLetter[0])

Возможно, вы должны сделать нужное письмо типа char, чтобы вы могли использовать:

if (e.KeyCode == (Keys)neededLetter)

А еще лучше, просто сделайте нужную букву типа Keys, чтобы вы могли просто сделать это:

if (e.KeyCode == neededLetter)
{
    if (neededLetter == Keys.N)
        neededLetter = Keys.O;
    else if (neededLetter == Keys.O)
        neededLetter = Keys.T;

    ...
}

@ Sergio, re: ввод только одним ключом:

Да, он принимает только один ввод с клавиатуры. На самом деле, если вы хотите интерпретировать комбинации клавиш, такие как Ctrl + A , вы не можете поймать их обоих одновременно в e.KeyCode, только последнюю нажатую клавишу (обычная клавиша или иное ( ключевые модификаторы)) регистрируется в e.KeyCode. Если нет булевых свойств модификатора ключа, таких как e.Control, e.Shift, e.Alt, мы не сможем читать сочетания клавиш, и нам придется свернуть нашу собственную процедуру для установки переменной состояния и определения, если эти клавиатуры модификаторы остаются / остаются у пользователя. Но, к счастью, есть встроенное свойство, которое указывает, что модификаторы все еще удерживаются пользователем, поэтому мы можем сделать это:

if (e.KeyCode == Keys.A && e.Control)
   MessageBox.Show("Test");

И чтобы проверить, что e.KeyCode регистрирует только последний ключ, независимо от того, является ли он ключом ( A ) или модификатором ключа ( Ctrl ). Попробуйте удерживать A (не отпускать), затем нажмите Ctrl , на экране появится слово «Test» not , последнее нажатие ( Ctrl ) также зарегистрирован на e.KeyCode. Но если вы будете удерживать Ctrl , тогда A , на экране появится слово «Тест», e.Control - это состояние, которое указывает, является ли Ctrl все еще удерживается пользователем.

0 голосов
/ 28 апреля 2010

Вы можете сделать это с немного более простой логикой, используя вместо этого KeyPress, например:

string buffer = ""; //buffer to store what the user typed: n, no, not, etc...
void gkh_KeyPress(object sender, KeyPressEventArgs e)
{
  buffer += e.KeyChar; //add key to the buffer, then check if we've made progress
  if (buffer.IndexOf("note") > -1) {
    this.Show(); //"notes" matched completely
    buffer = ""; //reset for another run
  }
  else if ("note".IndexOf(buffer) != 0) {
    buffer = ""; //Another key not in sequence was hit
  }
}
0 голосов
/ 28 апреля 2010

KeyEventArgs.KeyCode является значением перечисления. Из документации MSDN:

private void textBox1_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
{
    // Determine whether the key entered is the F1 key. If it is, display Help.
    if(e.KeyCode == Keys.F1 && (e.Alt || e.Control || e.Shift))
    {
        // Display a pop-up Help topic to assist the user.
        Help.ShowPopup(textBox1, "Enter your name.", new Point(textBox1.Bottom, textBox1.Right));
    }
    else if(e.KeyCode == Keys.F2 && e.Modifiers == Keys.Alt)
    {
        // Display a pop-up Help topic to provide additional assistance to the user.
        Help.ShowPopup(textBox1, "Enter your first name followed by your last name. Middle name is optional.",
            new Point(textBox1.Top, this.textBox1.Left));
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...