C#(VS2008)抑制修改器关键点的关键码,但保留修改器

C#(VS2008)抑制修改器关键点的关键码,但保留修改器,c#,c#-3.0,key,keypress,C#,C# 3.0,Key,Keypress,我试图完成一些类似于那个家伙的事情,但按照答案,会给我留下一个小错误,这不是什么大问题,但从用户角度来看是丑陋的: 当它将按键数据放入文本框时,如果用户在字符之前按修改器键(就像一个人那样),文本框将被填充,包括修改器的键名。也就是说,我得到的结果类似于“CTRL+SHIFT+ShiftKey”。我试图抑制最后一个键代码的任何操作最终也会抑制真正的键 这是我的基本尝试(请原谅我的封锁,我一直在打破它,重写它的一部分,试图自己解决这个问题,但无济于事),没有我要求的压制 String presse

我试图完成一些类似于那个家伙的事情,但按照答案,会给我留下一个小错误,这不是什么大问题,但从用户角度来看是丑陋的:

当它将按键数据放入文本框时,如果用户在字符之前按修改器键(就像一个人那样),文本框将被填充,包括修改器的键名。也就是说,我得到的结果类似于“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;

希望我在这里对我的问题足够清楚

您可以删除修改器标志:

pressed += (e.KeyCode & ~Keys.Modifiers & ~Keys.ShiftKey  & ~Keys.ControlKey);

这个解决方案怎么样:

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();
}

您可能会侥幸逃脱,但严格来说,您应该使用
=0
此处,而不是
>0
,就好像设置了MSB一样,它将显示为负数。您是对的。我已经修好了。谢谢。不幸的是,这似乎并不能阻止它返回修改键本身。谢谢,你改了吗?现在它可以正常工作了,只正确地处理修改器键的情况,但当字符键最终被按下时,它会以错误的键结束(即Ctrl-X导致“Ctrl+H”,Ctrl-C导致“Ctrl+64”)我确实想到了这一点。我想确保我没有错过一个更优雅的方式来做这件事。我会很快测试出来,谢谢。关于优雅的方式,请看