3

我需要确定一个键在按下时是否会更改控件的文本;我需要忽略诸如Ctrl+Zor之类的按键Esc,但是如果文本更改,我需要知道按下了哪个键。

有什么方法可以KeyDown事件中知道吗?目前,我正在使用一个标志,设置KeyDown并检查TextChanged,但我想知道是否有更好的方法?

4

3 回答 3

4

您正在寻找Char.IsControl

private Keys lastKey = Keys.None;
private void textBox1_KeyDown(object sender, KeyEventArgs e)
{
    lastKey = e.KeyData;
}

private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
    if (Char.IsControl(e.KeyChar))
    {
        e.Handled = true;//prevent this key press
        Keys pressedKey = this.lastKey;
        //Do your stuff with pressedKey  here
    }
}
于 2013-09-24T20:29:13.587 回答
1

您可以在文本框中捕获该KeyPress事件,如果它是您将设置的有效键e.handled = false,如果它是您将设置的坏键e.handled = true

示例来自:这里

private void keypressed(Object o, KeyPressEventArgs e)
    {
        // The keypressed method uses the KeyChar property to check  
        // whether the ENTER key is pressed.  

        // If the ENTER key is pressed, the Handled property is set to true,  
        // to indicate the event is handled. 
        if (e.KeyChar == (char)Keys.Return)
        {
            e.Handled = true;
        }
    }
于 2013-09-24T20:40:02.600 回答
0

有一些键会产生一个Control字符,但它们也会更改文本,例如BackSpace. 它们还有另一个困难:如果textbox为空,按下它们(例如BackSpace)不会改变文本;所以它打破了以前的规则。因此,Control角色不会天真地处理和建立规则。

此外,考虑Ctrl + CShift + Insert或类似的情况。“C”键有点诱人;这就像按 ' C' 更改文本,但如果按'Ctrl',它实际上并没有更改文本。我们应该检查Modifiers.

也许您可以找到其他困难来处理,我认为这种flag方法已经足够好了。

于 2013-09-24T20:43:43.583 回答