可以';如果其中一个键是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");
     }
}

可以';如果其中一个键是Alt、Control或Shift,则无法获取Windows窗体的组合键

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。