2011-08-09 7 views
0

私はこの関数をC#から呼び出しています。 GetKeyboardStatus()返されたビットマスク値をチェックする方法は?

ドキュメントを見ると、ビットマスク値が返されます。私のコードの目的は、デバイスに英数字の物理キーボードがあるかどうかを判断することです。私は正常にこの関数を呼び出し、戻り値は15です。しかし、私はビットマスクを理解していないので、ドキュメントによると0x0008の値と比較する方法はわかりません "キーボードのハードウェア英数字キーを持っています。 "私はあなたが私の質問に答えるために理解する必要があるのは、ビットマスクとC#であると思うので、私はこれをWindows MobileまたはCompact Frameworkの質問としてタグ付けしていません。そして、答えがビットマスクで作業する方法の理解を広げることを望んでいますしかし、必要はありません)。ここに私のコードです。手助けしようとしているため

 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(); 

おかげで、私は、これは、英数字キーを使用して物理的なキーボードがあるかどうかを決定するために信頼性の高い方法ではないことを発見した:私は間違っている部分のみがreturn文だと思います。私は2つのデバイスを試しました.1つはキーボードと1つで、もう1つはGetKeyboardStatus関数で15を返すので、答えのビットマスクの説明もテストできません。

答えて

1

return (returnValue & KBDI_KEYBOARD_ALPHA_NUM) != 0;

のreturnValueのビット3にかかわらずのreturnValue内の他のビットのいずれかの値の、設定されている場合、これがtrueを返すしてみてください。

1

私はビット演算子があなたが欲しいもの、特にbitwise-AND(&)と信じています。ビット単位ANDは、2つのオペランドの各ビットを調べ、両方のビットが「1」であれば「1」を返し、そうでなければ「0」を返す。したがって、特定のフラグ値を持つビットマスクとANDを行い、0以外の結果を得ると、ビットマスクにフラグが含まれていることがわかります。

return (returnValue & KBDI_KEYBOARD_ALPHA_NUM) != 0; 
0

は、基本的にはこれだけのビット単位のAND演算を使用して、4番目のビットがセットされているかどうかを確認する必要があります。

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

ビット単位の操作は、あなたが実際の作品にそれらを書く場合は理解することが非常に簡単に取得しますバイナリ値

あなた15(10進数)のような紙は、バイナリ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 

ある:論理AND演算の結果は、数ありますtrue/falseではありません。 あなたは結果がKBDI_KEYBOARD_ALPHA_NUMからすべてビットが、私はこの

if ((returnValue & KBDI_KEYBOARD_ALPHA_NUM) == KBDI_KEYBOARD_ALPHA_NUM) { /* YES */ } 

のようにチェックすることを好むだろうし、私は私がどんなをしたい場合にのみ!= 0と結果を比較するだろうしたいので、 KBDI_KEYBOARD_ALPHA_NUMのビットのうちのどれを設定するかを指定します。この場合、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に比較すると、あなたのコードは自明

ことはありません。
関連する問題