【问题标题】:When two buttons are pressed at same time同时按下两个按钮时
【发布时间】:2013-01-18 12:11:39
【问题描述】:

我有一个小问题。我有一个表格,这是我的登录表格。然后我还有另一个表单,就是我的添加用户表单。当我单击登录表单的登录按钮时,它需要检查 shift 和 control 键是否同时按住。 Ff 他们两个都没有被按下,那么添加用户表单不应该打开。但如果它们都被按下并单击登录按钮,它应该显示表单。

我有什么:

if (Control.ModifierKeys == (Keys.Control & Keys.Shift))
{
    //Show the form
}

但这不起作用。

当我有:

if (Control.ModifierKeys == Keys.Shift)
{
    //Show the form
}

然后就可以了。

我怎样才能通过同时按下控制和换档按钮来实现这一点?

【问题讨论】:

    标签: c#


    【解决方案1】:

    试试Keys.Control | Keys.Shift


    这是一个标志枚举;每个值都由底层int 中的一个单独位表示。

    Keys.Control & Keys.Shift 产生零值 - 例如如果Control0001 并且Shift0010,则按位-&0000

    Control.ModifierKeys 将是 0000 当且仅当用户按住 no 修饰键时,所以 == 只会在用户未按住时导致 true什么都下来了。

    另一方面,

    Keys.Control | Keys.Shift 会产生一个表示“这两个标志”的值 - 例如如果Control0001 并且Shift0010,则按位-|0011

    Control.ModifierKeys 将是 0011 当且仅当用户同时按住 CtrlShift 时,所以 == 只会导致 @987654344 @ 在这种情况下。


    或者,您可以将其分解为

    bool ctrlIsHeldDown  = (Control.ModifierKeys & Keys.Control) == Keys.Control;
    bool shiftIsHeldDown = (Control.ModifierKeys & Keys.Shift)   == Keys.Shift;
    if (CtrlIsHeldDown && shiftIsHeldDown)
    {
        ...
    }
    

    (value & x) == x 构造检查是否设置了单个标志 x,然后是标准布尔逻辑。

    【讨论】:

    • 这是一个 OR 语句。然后当我自己按下 control 时,它会进入,当我按下 shift 时,它自己也会进入。我希望它只有在它们都被搁置时才执行。
    • @Bebbie7 它是在检查相等性之前计算的“按位或”。
    • @Bebbie7 我添加了更多细节;在这种情况下,OR 基本上以相反的方式工作。
    【解决方案2】:

    你可以这样做:

    if (Control.ModifierKeys == (Keys.Control | Keys.Shift))
    {
        //Show the form
    }
    

    希望对您有所帮助。

    【讨论】:

      猜你喜欢
      • 2020-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多