如何检查返回的位掩码值

本文关键字:掩码 返回 何检查 检查 | 更新日期: 2023-09-27 18:05:17

我从c#中调用这个函数:GetKeyboardStatus ()

查看文档,它说它返回一个位掩码值。我的代码的目标是确定设备是否具有带有字母数字字符的物理键盘。我已经成功地调用了这个函数,返回值是15。然而,由于我不理解位掩码,我不知道如何将其与0x0008值进行比较,根据文档"指示键盘硬件是否具有字母数字键"。我并没有将这个问题标记为Windows Mobile或Compact Framework问题,因为我认为回答我的问题只需要了解位掩码和c#,我希望这个答案能扩展我对如何使用位掩码的理解(虽然不是必需的)。这是我的代码。我认为唯一错误的部分是返回语句:

        public static bool HasAlphaNumericKeys {
            get {
                const uint KBDI_KEYBOARD_ALPHA_NUM = 0x0008;
                uint returnValue = GetKeyboardStatus();
                return returnValue == KBDI_KEYBOARD_ALPHA_NUM;
            }
        }
        [DllImport("coredll")]
        private static extern uint GetKeyboardStatus();

谢谢你试图帮助,但我发现,这不是一个可靠的方式来确定是否有一个物理键盘与字母数字键。我尝试了2个设备,一个带键盘,一个没有键盘,GetKeyboardStatus函数为它们两个返回15,所以我甚至无法测试答案中位掩码的解释。

如何检查返回的位掩码值

如果将位运算写成二进制值,就容易理解得多了

you15(十进制)是二进制1111 (2^3 +2 ^2 +2 ^1 +2 ^0)= (8+4+2+1)
8(十进制)是二进制1000 (2^3 +0+0+0)= (8+0+0+0)

A 逻辑且表示对于每个位,如果两个值都为1,则结果为1,否则为0

    In our case the (Y means both are 1 and N means one or both have a 0):
    1111
    1000
    ----
    YNNN
    Or in it's binary result
    1000  

因此记录:逻辑与运算的结果是一个数字,而不是真/假。由于您希望结果具有所有来自KBDI_KEYBOARD_ALPHA_NUM集合的位,因此我更喜欢这样检查

if ((returnValue & KBDI_KEYBOARD_ALPHA_NUM) == KBDI_KEYBOARD_ALPHA_NUM) { /* YES */ }
只有当我想要设置KBDI_KEYBOARD_ALPHA_NUM中的任何位时,我才会将结果与!= 0进行比较。因为在这种情况下只涉及1位,所以两者的工作原理是一样的。但是为了说明它们的区别:
const uint NEED_ALL_THESE_BITS = 0x0009;   // Binary: 1001
uint result = 3; // Binary: 0011;
((result & NEED_ALL_THESE_BITS) != 0) --> True
((result & NEED_ALL_THESE_BITS) == NEED_ALL_THESE_BITS) --> False

当你想要设置所有的位时,比较!= 0并不能使你的代码自解释

Try

return (returnValue & KBDI_KEYBOARD_ALPHA_NUM) != 0;

如果设置了returnValue的第3位,则返回true,无论returnValue中其他任何位的值如何。

我相信位运算符是您想要的,特别是位与(&)。按位与操作查看两个操作数的每一位,如果两位都是"1",则返回"1",否则返回"0"。因此,如果您将位掩码与特定的标志值进行AND运算,并且得到非零的结果,则您知道该位掩码包含该标志。

return (returnValue & KBDI_KEYBOARD_ALPHA_NUM) != 0;

基本上你需要检查第四个位是否设置,所以只使用按位与操作:

bool IsAbc(int key)
{
  return 0 != (0x08 & key);
}