3

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

我有的:

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

但这不起作用。

当我有:

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

然后它工作。

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

4

2 回答 2

11

试试Keys.Control | Keys.Shift


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

Keys.Control & Keys.Shift导致零值 - 例如,如果Controlis0001Shiftis 0010,按位- &is 0000

Control.ModifierKeys0000且仅当用户没有按住任何修饰键时才会出现,所以只有当用户没有按住任何东西时==才会导致。true

Keys.Control | Keys.Shift另一方面,会产生一个表示“这两个标志”的值-例如,如果Control0001Shift0010,则按位-|0011

Control.ModifierKeys0011且仅当用户同时按住CtrlShift按住时才会出现,所以==只会true在这种情况下导致。


或者,您可以将其分解为

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

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

于 2013-01-18T12:13:00.780 回答
3

你可以这样做 :

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

希望这有帮助。

于 2013-01-18T12:14:44.753 回答