2011-08-09 15 views
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(); 

感謝試圖幫助,但我發現,這是不以確定是否有物理鍵盤,字母數字鍵的可靠方法。我嘗試了兩種設備,一種是鍵盤,另一種是沒有,GetKeyboardStatus函數爲它們返回15,所以我甚至不能在答案中測試位掩碼的解釋。

回答

1

嘗試

return (returnValue & KBDI_KEYBOARD_ALPHA_NUM) != 0;

如果的returnValue的第3位被置位,而不管在任何的returnValue其它位的值的這返回true。

1

我相信按位運算符是你想要的,特別是按位與(&)。按位AND查看兩個操作數的每一位,如果兩位均爲1,則返回「1」,否則返回「0」。所以如果你和一個具有特定標誌值的位掩碼並獲得一個非零結果,你就知道該位掩碼包含該標誌。

return (returnValue & KBDI_KEYBOARD_ALPHA_NUM) != 0; 
0

基本上你需要檢查第四位是否被設置,所以只用按位與運算:

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

的位運算得到一個更容易理解,如果你真的把它們寫在一張紙作爲二進制值

您15(十進制)是二進制1111(2^3 + 2^2 + 2^1 + 2^0)=(8 + 4 + 2 + 1)
8 )是二進制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 

所以對於記錄:該邏輯與運算的結果是一個數字而不是真/假。 既然你想要的結果有所有的從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時,你希望所有的位可設定不使你的代碼不言自明