我的程序有几个键组合,但每当按下Shift,Alt或Control时,它们都会覆盖不是其中任何一个键的任何其他键,即使它们没有相互覆盖。有人可以帮我找到一种方法来确保KeyEventArgs(或一些等效函数)同时获得两者,例如Shift + W?在下面的代码中,无论我是通过按住W还是Shift开始,我都只获得移动写字线,而不是组合。
private void Form1_KeyDown(object sender, KeyEventArgs e)
{
if (e.Shift)
{
if (e.KeyData == Keys.W || e.KeyData == Keys.S)
{
Console.WriteLine("combination");
}
Console.WriteLine("shift");
}
}
答案 0 :(得分:1)
KeyData
属性公开了按以及作为活动修饰符的键。所以你会这样使用它:
private void Form1_KeyDown(object sender, KeyEventArgs e) {
if (e.KeyData == (Keys.Shift | Keys.W) || e.KeyData == (Keys.Shift | Keys.S)) {
Console.WriteLine("combination");
}
}
您也可以按照自己的方式进行操作,但之后必须使用其他属性KeyCode
。它只显示密钥代码而不用修饰键:
private void Form1_KeyDown(object sender, KeyEventArgs e) {
if (e.Shift) {
Console.WriteLine("shift");
if (e.KeyCode == Keys.W || e.KeyCode == Keys.S) {
Console.WriteLine("combination");
}
}
}
你使用哪一件完全取决于你。但请记住,使用表单的KeyDown事件不是很正确。它还需要将KeyPreview属性设置为true。这是一个非常丑陋的VB6兼容性属性,你无法看到每一个可能的击键。导航键被过滤,就像在VB6中完成的那样。本机Winforms方式是重写ProcessCmdKey()方法。哪个 要求您使用KeyData。