0

C# からこの関数を呼び出しています: GetKeyboardStatus()

ドキュメントを見ると、ビットマスク値を返すと書かれています。私のコードの目標は、デバイスに英数字の物理キーボードがあるかどうかを判断することです。この関数の呼び出しに成功し、戻り値は 15 です。ただし、ビット マスクを理解していないため、それを 0x0008 値と比較する方法がわかりません。ドキュメントによると、「キーボード ハードウェアが英数字キーがあります。」これを Windows Mobile または Compact Framework の質問としてタグ付けすることはありません。私の質問に答えるために理解する必要があるのはビット マスクと C# だけだと思う​​からです。答えがビット マスクの操作方法の理解を深めてくれることを願っています (必須ではありませんが)。これが私のコードです。間違っているのはreturnステートメントだけだと思います:

        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 を返したため、回答のビット マスクの説明をテストすることさえできません。

4

4 に答える 4

2

ビット単位の演算は、実際に2進値として紙に書くと、はるかに理解しやすくなります。

あなた15(10進数)は2進数1111(2 ^ 3 + 2 ^ 2 + 2 ^ 1 + 2 ^ 0)=(8 + 4 + 2 + 1)
8(10進数)は2進数1000(2 ^ 3 + 0 + 0 + 0)=(8 + 0 + 0 + 0)

論理積とは、各ビットについて、両方の値が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  

したがって、記録のために:論理積演算の結果は数値であり、true/falseではありません。結果に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と比較しても、コードがわかりやすくなるわけではありません。

于 2011-08-09T22:36:48.973 に答える
1

試す

return (returnValue & KBDI_KEYBOARD_ALPHA_NUM) != 0;

これは、returnValue の他のビットの値に関係なく、returnValue のビット 3 が設定されている場合に true を返します。

于 2011-08-09T22:08:36.320 に答える
1

ビット演算子、具体的にはビット AND (&) が必要だと思います。ビットごとの AND は、2 つのオペランドの各ビットを調べ、両方のビットが「1」の場合は「1」を返し、それ以外の場合は「0」を返します。したがって、ビットマスクと特定のフラグ値の AND をとり、ゼロ以外の結果が得られた場合、ビットマスクにフラグが含まれていることがわかります。

return (returnValue & KBDI_KEYBOARD_ALPHA_NUM) != 0;
于 2011-08-09T22:08:36.637 に答える
0

基本的に、4 番目のビットが設定されているかどうかを確認する必要があるため、ビットごとの AND 演算を使用します。

bool IsAbc(int key)
{
  return 0 != (0x08 & key);
}
于 2011-08-09T22:10:26.820 に答える