C # (VS2008) Подавление ключевого кода для клавиш-модификаторов, но сохранение модификаторов

Я пытаюсь сделать что-то похожее на этого парня здесь, но ответ там оставляет мне небольшую ошибку, которая не такая уж большая проблема, но уродливая с точки зрения пользователя:

Когда он помещает данные нажатия клавиш в текстовое поле, если пользователь нажимает клавиши-модификаторы перед символом (как это делается), текстовое поле заполняется, включая имя клавиши модификатора. То есть я получаю такие результаты, как «CTRL + SHIFT + ShiftKey». Все, что я пытаюсь сделать для подавления этого последнего ключевого кода, в конечном итоге приводит к подавлению и реальных клавиш.

Это моя основная попытка (простите за блочность, я разбивал ее и переписывал ее части, пытаясь решить эту проблему самостоятельно, но безрезультатно) без подавления, о котором я прошу.

String pressed ="";
e.SuppressKeyPress = true;
if ((e.Modifiers & Keys.Control) > 0)
{
    pressed += "CTRL + ";
}
if ((e.Modifiers & Keys.Alt) > 0)
{
    pressed += "ALT + ";
}
if ((e.Modifiers & Keys.Shift) > 0)
{
    pressed += "SHIFT + ";
}


    pressed += e.KeyCode; 


    txtCopyKey.Text = pressed;

Надеюсь, я достаточно ясно понимаю, о чем прошу.


person GeminiDomino    schedule 04.01.2010    source источник
comment
Возможно, вам это сойдет с рук, но строго вы должны использовать здесь !=0, а не >0, так как если установлен MSB, он будет отображаться как отрицательный.   -  person Marc Gravell    schedule 04.01.2010
comment
Ты прав. Я исправил это. Спасибо.   -  person GeminiDomino    schedule 04.01.2010


Ответы (2)


Что насчет этого решения:

private void Form1_KeyDown(object sender, KeyEventArgs e)
{
    StringBuilder sb = new StringBuilder();

    if (e.Control)
    {
        sb.Append(Keys.Control.ToString());
        sb.Append(" + ");
    }

    if (e.Alt)
    {
        sb.Append(Keys.Alt.ToString());
        sb.Append(" + ");
    }

    if (e.Shift)
    {
        sb.Append(Keys.Shift.ToString());
        sb.Append(" + ");
    }

    if (e.KeyCode != Keys.ShiftKey
        && e.KeyCode != Keys.ControlKey
        && e.KeyCode != Keys.Menu)
    {
        sb.Append(e.KeyCode.ToString());
    }

    textBox1.Text = sb.ToString();
}
person Oliver    schedule 04.01.2010
comment
Это действительно пришло мне в голову. Я хотел убедиться, что не упустил более элегантный способ сделать это. Я скоро его протестирую, спасибо. - person GeminiDomino; 04.01.2010
comment
Для элегантных способов взгляните на stackoverflow .com / questions / 921180 / c-round-up / 926806 # 926806. - person Oliver; 05.01.2010

Вы можете удалить флаги модификатора:

pressed += (e.KeyCode & ~Keys.Modifiers & ~Keys.ShiftKey  & ~Keys.ControlKey);
person Thomas Levesque    schedule 04.01.2010
comment
К сожалению, это, похоже, не мешает ему вернуть сам ключ-модификатор. Спасибо хоть. - person GeminiDomino; 04.01.2010
comment
Вы его меняли? Теперь он вроде работает, правильно обрабатывая ситуацию с клавишей только-модификатора, но в итоге получается неправильная клавиша, когда наконец нажимается символьная клавиша (то есть Ctrl-X приводит к CTRL + H, а Ctrl-C дает CTRL + 64 - person GeminiDomino; 04.01.2010