Проверка, установлены ли определенные биты во флаге DWORD - PullRequest
0 голосов
/ 13 августа 2011

У меня есть переменная DWORD, и я хочу проверить, установлены ли в ней определенные биты. У меня есть код ниже, но я не уверен, переношу ли я биты из типа данных win32 KBDLLHOOKSTRUCTмой тип данных lparam правильно?

См. MSDN, в котором задана переменная флага DWORD: http://msdn.microsoft.com/en-us/library/ms644967(v=vs.85).aspx

union KeyState 
{
    LPARAM lparam;      

    struct     
    {         
        unsigned nRepeatCount : 16;         
        unsigned nScanCode    : 8;         
        unsigned nExtended    : 1;         
        unsigned nReserved    : 4;         
        unsigned nContext     : 1;         
        unsigned nPrev        : 1;         
        unsigned nTrans       : 1;     
    }; 
}; 


KBDLLHOOKSTRUCT keyInfo = *((KBDLLHOOKSTRUCT*)lParam);
KeyState myParam;
myParam.nRepeatCount    = 1;
myParam.nScanCode       = keyInfo.scanCode;
myParam.nExtended       = keyInfo.flags && LLKHF_EXTENDED; // maybe it should be keyInfo.flags & LLKHF_EXTENDED or keyInfo.flags >> LLKHF_EXTENDED
myParam.nReserved       = 0;        
myParam.nContext        = keyInfo.flags && LLKHF_ALTDOWN;     
myParam.nPrev           = 0; // can store the last key pressed as virtual key/code, then check against this one, if its the same then set this to 1 else do 0   
myParam.nTrans          = keyInfo.flags && LLKHF_UP;


// Or maybe I shd do this to transfer bits...
myParam.nRepeatCount    = 1;
myParam.nScanCode       = keyInfo.scanCode;
myParam.nExtended       = keyInfo.flags & 0x01;
myParam.nReserved       = (keyInfo.flags >> 0x01) & (1<<3)-1;      
myParam.nContext        = keyInfo.flags & 0x05;     
myParam.nPrev           = 0;       // can store the last key pressed as virtual key/code, then check against this one, if its the same then set this to 1 else do 0   
myParam.nTrans          = keyInfo.flags & 0x07;

Ответы [ 3 ]

0 голосов
/ 13 августа 2011

Вместо

myParam.nExtended = keyInfo.flags && LLKHF_EXTENDED

вам нужно

myParam.nExtended = (keyInfo.flags & LLKHF_EXTENDED) != 0;

Это & не &&, потому что вы хотите поразрядно и не логично и !=0 гарантирует, что ответ будет либо 0, либо 1 (а не 0 или какое-либо другое ненулевое значение), поэтому он может быть представлен в вашем однобитовом битовом поле.

0 голосов
/ 18 октября 2013
CheckBits(DWORD var, DWORD mask)
{
    DWORD setbits=var&mask; //Find all bits are set
    DWORD diffbits=setbits^mask; //Find all set bits that differ from mask
    return diffbits!=0; //Retrun True if all specific bits in variable are set
}
0 голосов
/ 13 августа 2011

Если вы хотите объединить два бита, вы должны использовать оператор | ( побитовое ИЛИ ):

myParam.nExtended = keyInfo.flags | LLKHF_EXTENDED;

myParam.nExtended = keyInfo.flags | 0x01;

Чтобы проверить, был ли установлен бит, вы должны использовать оператор & ( поразрядно И ):

if(myParam.nExtended & LLKHF_EXTENDED) ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...