可以';如果其中一个键是Alt、Control或Shift,则无法获取Windows窗体的组合键
本文关键字:Shift Control 组合 窗体 Windows 获取 如果 一个 可以 Alt | 更新日期: 2023-09-27 18:20:55
我的程序有几个键组合,但每当按下Shift、Alt或Control时,它们都会覆盖任何其他不是这3个键之一的键,即使它们不会相互覆盖。有人能帮我找到一种方法来确保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");
}
}
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。