使用C#测试Ctrl键是否按下

66

我有一个表单,用户可以双击鼠标并执行某些操作。现在我想知道用户是否还按住了Ctrl键并双击表单。

如何判断用户是否按住了Ctrl键?


这是关于<kbd>Shift</kbd>键的。但概念是相同的。 - LiamB
在我看来,如果我们已经有了预定义的元素来帮助我们,就不需要使用不易维护的“魔法数字”,这样会让人感到混乱。 - Grant Thomas
@GrantThomas 我相信他指的是那个帖子中的答案,除了使用不同的修饰键之外,它们提供了与您提供的完全相同的内容。 - Dan Bechard
@Dan 可能是这样,但事后来看这只值得评论,除非他希望从那里复制并重复。 - Grant Thomas
6个回答

117

在 .NET 4 中,您可以使用以下简单方法:

    private void Control_DoubleClick(object sender, EventArgs e)
    {
        if (ModifierKeys.HasFlag(Keys.Control))
        {
            MessageBox.Show("Ctrl is pressed!");
        }
    }

如果您未使用.NET 4,则无法使用Enum.HasFlag,但是在以前的版本中实现相同的结果:

    private void CustomFormControl_DoubleClick(object sender, EventArgs e)
    {
        if ((ModifierKeys & Keys.Control) == Keys.Control)
        {
            MessageBox.Show("Ctrl is pressed!");
        }
    }

也许不行,但如果不可能的话,我的第二个例子仍然应该能解决问题。 - Grant Thomas
Enum.HasFlag比使用位运算符慢大约16倍。stackoverflow.com/questions/7368652 - NET3
这是一个合理的考虑,但并非总是如此。 - Grant Thomas

41

为了完整起见... ModifierKeysControl 的一个静态属性,所以即使你不直接在事件处理程序中,也可以测试它:

public static bool IsControlDown()
{
    return (Control.ModifierKeys & Keys.Control) == Keys.Control;
}

2
这是一个非常重要的注意点,如果您正在尝试在不直接驻留在表单中的代码中进行此检查。 - eidylon
为什么特别呢? - Rob
在我的情况下,我正在为第三方系统中的插件编写一个代码后台dll。他们所有插件的UI框架都是基于Web的,而不是Windows控件...所以即使我的代码在“表单”中,它也没有正常访问通常的Windows Forms属性。因此,我不能只调用ModifierKeys; 我需要在前面加上Control.限定符。 - eidylon

14

虽然这并不是回答问题的方法,但我需要在控制台应用程序中完成此操作,并且细节略有不同。

我不得不添加对 WindowsBasePresentationFramework 的引用,然后在此时我可以执行以下操作:

if (System.Windows.Input.Keyboard.Modifiers == ModifierKeys.Control)
   blah

只是在这里添加一下,以防其他人也在进行类似的操作。


7

即使是这样也可以

 private void Control_MouseDoubleClick(object sender, MouseEventArgs e)
    {
        if (ModifierKeys == Keys.Control)
            MessageBox.Show("with CTRL");
    }

4
这对我很有效:
 if(Keyboard.IsKeyDown(Key.LeftCtrl))
    {}

并添加对 PresentationCore 和 WindowsBase 的引用


这个可以用,其他的建议都不行,语法问题。 - Ted
3
此解决方案适用于WPF,而非WinForms。 - philu

2

上面有人说了同样的话,但是与零进行比较时不同,这应该会更快,并且在大多数架构上使用更少的指令:

public static bool IsControlDown()
{
    return (Control.ModifierKeys & Keys.Control) != 0;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接