在KeyDown事件中访问VBA位掩码

时间:2018-08-23 05:45:02

标签: ms-access access-vba

我希望使用Access键事件,但需要更好地了解代码的工作方式。在下面的代码中,我不了解“((Shift和acShiftMask)> 0”)的工作方式。如果有人可以帮助我理解位掩码以及以下代码的工作原理,我将不胜感激!

Private Sub KeyHandler_KeyDown(KeyCode As Integer, _ 
 Shift As Integer) 
Dim intShiftDown As Integer, intAltDown As Integer 
Dim intCtrlDown As Integer 

' Use bit masks to determine which key was pressed. 
intShiftDown = (Shift And acShiftMask) > 0 
intAltDown = (Shift And acAltMask) > 0 
intCtrlDown = (Shift And acCtrlMask) > 0 
' Display message telling user which key was pressed. 
If intShiftDown Then MsgBox "You pressed the SHIFT key." 
If intAltDown Then MsgBox "You pressed the ALT key." 
If intCtrlDown Then MsgBox "You pressed the CTRL key." 

结束子

1 个答案:

答案 0 :(得分:1)

Shift参数包含某些,这些位在触发KeyDown事件时编码SHIFT,CTRL和ALT键的状态。内置常量acShiftMask(= 1acCtrlMask(= 2)和acAltMask(= 4)仅包含该位编码(“掩码”)这些特殊键之一。按位,看起来像这样:

acShiftMask: 0000000000000001
acCtrlMask : 0000000000000010
acAltMask  : 0000000000000100

现在,如果用户同时按下SHIFT和CTRL键,则Shift参数将如下所示:

Shift      : 0000000000000011

要检查是否按下了SHIFT键,代码必须测试移位掩码的位,这是通过按位的AND运算符完成的:

0000000000000011 AND 0000000000000001 = 0000000000000001 (<>0)

<>0(实际上,比较应该像这样)。确切地说,比较应为(Shift And acShiftMask) = acShiftMask,保存结果的变量可以为Boolean类型。

无论如何,如果比较成立,则结果不为零,因此按下了特殊键。如果结果为零(如本例中的ALT键一样),则不会按下该键:

0000000000000011 AND 0000000000000100 = 0000000000000000 (=0)