我需要确定一个键在按下时是否会更改控件的文本;我需要忽略诸如Ctrl+Z
or之类的按键Esc
,但是如果文本更改,我需要知道按下了哪个键。
有什么方法可以在KeyDown
事件中知道吗?目前,我正在使用一个标志,设置KeyDown
并检查TextChanged
,但我想知道是否有更好的方法?
我需要确定一个键在按下时是否会更改控件的文本;我需要忽略诸如Ctrl+Z
or之类的按键Esc
,但是如果文本更改,我需要知道按下了哪个键。
有什么方法可以在KeyDown
事件中知道吗?目前,我正在使用一个标志,设置KeyDown
并检查TextChanged
,但我想知道是否有更好的方法?
您正在寻找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
}
}
您可以在文本框中捕获该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;
}
}
有一些键会产生一个Control
字符,但它们也会更改文本,例如BackSpace
. 它们还有另一个困难:如果textbox
为空,按下它们(例如BackSpace
)不会改变文本;所以它打破了以前的规则。因此,Control
角色不会天真地处理和建立规则。
此外,考虑Ctrl + C
或Shift + Insert
或类似的情况。“C”键有点诱人;这就像按 ' C
' 更改文本,但如果按'Ctrl'
,它实际上并没有更改文本。我们应该检查Modifiers
.
也许您可以找到其他困难来处理,我认为这种flag
方法已经足够好了。