Testing whether specific bits are set in a DWORD flag - c++
I have a DWORD variable & I want to test if specific bits are set in it. I have my code below but I am not sure if I am transferring the bits from the win32 data type KBDLLHOOKSTRUCT to my lparam datatype correctly?
See MSDN that documents the DWORD flag variable: 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;
Rather than
myParam.nExtended = keyInfo.flags && LLKHF_EXTENDED
you need
myParam.nExtended = (keyInfo.flags & LLKHF_EXTENDED) != 0;
It's & not && because you want a bitwise and not a logical and. And the !=0 ensures the answer is either 0 or 1 (rather than 0 or some-other-nonzero-value) so it can be represented in your one-bit bitfield.
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
}
If you want to merge two bits, you would use | (bitwise OR) operator:
myParam.nExtended = keyInfo.flags | LLKHF_EXTENDED;
myParam.nExtended = keyInfo.flags | 0x01;
To check if bit was set, you would use & (bitwise AND) operator:
if(myParam.nExtended & LLKHF_EXTENDED) ...
Related
ToUnicodeEx not printing "Greater Than"
I wrote a function which processes the user keyboard in order to write text in an app. In order to do that I use the ToUnicodeEx function which uses an array of Key states. The function is working perfectly fine for every possible input, except for one : I cannot display the ">" sign, which is supposed to be the combination of "SHIFT + <" : it displays the "<" sign instead, as if the SHIFT key was not pressed, whereas it knows it it pressed. Has somebody already experienced the same and knows what the problem is? You will find my function code below : void MyFunction(bool bCapsLockDown) { IOClass io = GetMyIOInstance(); HKL layout = GetKeyboardLayout( 0 ); uchar uKeyboardState[256]; WCHAR oBuffer[5] = {}; //Initialization of KeyBoardState for (uint i = 0; i < 256; ++i) { uKeyBoardState[i] = 0; } // Use of my ConsultKeyState to get the status of pressed keys if ( ConsultKeyState( VK_SHIFT ) || bCapsLockDown ) { uKeyboardState[VK_CAPITAL] = 0xff; } if ( ConsultKeyState( VK_CONTROL ) ) { uKeyboardState[VK_CONTROL] = 0xff; } if ( ConsultKeyState( VK_MENU ) ) { uKeyboardState[VK_MENU] = 0xff; } if ( ConsultKeyState( VK_RMENU ) ) { uKeyboardState[VK_MENU] = 0xff; uKeyboardState[VK_CONTROL] = 0xff; } for ( uint iVK = 0; iVK < 256; ++iVK ) { bool bKeyDown = ConsultKeyState( iVK ) != 0; uint iSC = MapVirtualKeyEx( iVK, MAPVK_VK_TO_VSC, layout ); bool bKeyAlreadyDown = io.KeysDown[iVK]; io.KeysDown[iVK] = bKeyDown; if ( io.KeysDown[iVK] && bKeyAlreadyDown == false ) { int iRet = ToUnicodeEx( iVK, iSC, uKeyboardState, (LPWSTR)oBuffer, 4, 0, layout ); if( iRet > 0 && (iswgraph( (unsigned short) oBuffer[0] ) || oBuffer[0] == ' ') ) io.AddInputCharacter( (unsigned short) oBuffer[0] ); } } } Edit : To summarize, my question is : What would be the good combination VirtualKey + KeyBoardState to get a ">" displayed?
The problem is that shift and caps lock do not have the same effect on a keyboard. For example, (on a UK keyboard) pressing shift+1 = !, but pressing 1 with caps lock on still give you 1. Your code currently treats them the same, though, and it is using VK_CAPITAL in both cases. This will give you the same effect as if caps lock were on, which is not what you want in this case. The solution is therefore to break out your logic and use VK_SHIFT when you really want shift to be pressed and VK_CAPITAL when you want caps lock to be active.
CRC-CCITT Implementation
I am using the following function to generate a CRC sum and it doesn't appear to be returning the same checksum when compared to online CRC-CCITT calculators. This function specifically uses the XMODEM CRC generation with a 0x8408 polynomial with an initial fcs of 0xFFFF. uint16_t crc16(uint8_t byte, uint16_t fcs) { uint8_t bit; for(bit=0; bit<8; bit++) { fcs ^= (byte & 0x01); fcs = (fcs & 0x01) ? (fcs >> 1) ^ 0x8408 : (fcs >> 1); byte = byte >> 1; } return fcs; } Am I doing something wrong? If I send 0xFF, or 0x00 I do not get the same checksum as I do on http://depa.usst.edu.cn/chenjq/www2/SDesign/JavaScript/CRCcalculation.htm printf("%04X\n", crc16(0x31, 0xFFFF)); //returns 2F8D
I have read your questions and I also had the similar problem like you. I have solved this issue for calculating CRC-CCITT in XMODEM. here I am attaching the sample program to calculate CRC-CCITT. I have tried the data with the online converter and this program. Please use this if you wish. unsigned short crc16(char *ptr, int count) { int crc; char i; crc = 0; while (--count >= 0) { crc = crc ^ (int) *ptr++ << 8; i = 8; do { if (crc & 0x8000) crc = crc << 1 ^ 0x1021; else crc = crc << 1; } while(--i); } return (crc); } CRC should be defined as unsigned short since the crc16 function returns an unsigned short. CRC is defined as an int which on most systems is 4 bytes.
Take a look at Greg Cook's excellent catalog of CRCs. There is a variant often falsely identified as the CCITT CRC, which it isn't. That is what your code, with the 0xFFFF initialization, appears to be computing, though reflected. The Kermit CRC is the actual CCITT CRC. To get the CCITT CRC, you should start with zero, not 0xFFFF. The XMODEM CRC is different still, like the Kermit CRC, but unreflected (so bits go in the top, and you exclusive-or with 0x1021). KERMIT width=16 poly=0x1021 init=0x0000 refin=true refout=true xorout=0x0000 check=0x2189 name="KERMIT" XMODEM width=16 poly=0x1021 init=0x0000 refin=false refout=false xorout=0x0000 check=0x31c3 name="XMODEM" CRC-16/CCITT-FALSE width=16 poly=0x1021 init=0xffff refin=false refout=false xorout=0x0000 check=0x29b1 name="CRC-16/CCITT-FALSE"
static const unsigned short CRC_CCITT_TABLE[256] = { 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50A5, 0x60C6, 0x70E7, 0x8108, 0x9129, 0xA14A, 0xB16B, 0xC18C, 0xD1AD, 0xE1CE, 0xF1EF, 0x1231, 0x0210, 0x3273, 0x2252, 0x52B5, 0x4294, 0x72F7, 0x62D6, 0x9339, 0x8318, 0xB37B, 0xA35A, 0xD3BD, 0xC39C, 0xF3FF, 0xE3DE, 0x2462, 0x3443, 0x0420, 0x1401, 0x64E6, 0x74C7, 0x44A4, 0x5485, 0xA56A, 0xB54B, 0x8528, 0x9509, 0xE5EE, 0xF5CF, 0xC5AC, 0xD58D, 0x3653, 0x2672, 0x1611, 0x0630, 0x76D7, 0x66F6, 0x5695, 0x46B4, 0xB75B, 0xA77A, 0x9719, 0x8738, 0xF7DF, 0xE7FE, 0xD79D, 0xC7BC, 0x48C4, 0x58E5, 0x6886, 0x78A7, 0x0840, 0x1861, 0x2802, 0x3823, 0xC9CC, 0xD9ED, 0xE98E, 0xF9AF, 0x8948, 0x9969, 0xA90A, 0xB92B, 0x5AF5, 0x4AD4, 0x7AB7, 0x6A96, 0x1A71, 0x0A50, 0x3A33, 0x2A12, 0xDBFD, 0xCBDC, 0xFBBF, 0xEB9E, 0x9B79, 0x8B58, 0xBB3B, 0xAB1A, 0x6CA6, 0x7C87, 0x4CE4, 0x5CC5, 0x2C22, 0x3C03, 0x0C60, 0x1C41, 0xEDAE, 0xFD8F, 0xCDEC, 0xDDCD, 0xAD2A, 0xBD0B, 0x8D68, 0x9D49, 0x7E97, 0x6EB6, 0x5ED5, 0x4EF4, 0x3E13, 0x2E32, 0x1E51, 0x0E70, 0xFF9F, 0xEFBE, 0xDFDD, 0xCFFC, 0xBF1B, 0xAF3A, 0x9F59, 0x8F78, 0x9188, 0x81A9, 0xB1CA, 0xA1EB, 0xD10C, 0xC12D, 0xF14E, 0xE16F, 0x1080, 0x00A1, 0x30C2, 0x20E3, 0x5004, 0x4025, 0x7046, 0x6067, 0x83B9, 0x9398, 0xA3FB, 0xB3DA, 0xC33D, 0xD31C, 0xE37F, 0xF35E, 0x02B1, 0x1290, 0x22F3, 0x32D2, 0x4235, 0x5214, 0x6277, 0x7256, 0xB5EA, 0xA5CB, 0x95A8, 0x8589, 0xF56E, 0xE54F, 0xD52C, 0xC50D, 0x34E2, 0x24C3, 0x14A0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405, 0xA7DB, 0xB7FA, 0x8799, 0x97B8, 0xE75F, 0xF77E, 0xC71D, 0xD73C, 0x26D3, 0x36F2, 0x0691, 0x16B0, 0x6657, 0x7676, 0x4615, 0x5634, 0xD94C, 0xC96D, 0xF90E, 0xE92F, 0x99C8, 0x89E9, 0xB98A, 0xA9AB, 0x5844, 0x4865, 0x7806, 0x6827, 0x18C0, 0x08E1, 0x3882, 0x28A3, 0xCB7D, 0xDB5C, 0xEB3F, 0xFB1E, 0x8BF9, 0x9BD8, 0xABBB, 0xBB9A, 0x4A75, 0x5A54, 0x6A37, 0x7A16, 0x0AF1, 0x1AD0, 0x2AB3, 0x3A92, 0xFD2E, 0xED0F, 0xDD6C, 0xCD4D, 0xBDAA, 0xAD8B, 0x9DE8, 0x8DC9, 0x7C26, 0x6C07, 0x5C64, 0x4C45, 0x3CA2, 0x2C83, 0x1CE0, 0x0CC1, 0xEF1F, 0xFF3E, 0xCF5D, 0xDF7C, 0xAF9B, 0xBFBA, 0x8FD9, 0x9FF8, 0x6E17, 0x7E36, 0x4E55, 0x5E74, 0x2E93, 0x3EB2, 0x0ED1, 0x1EF0 }; I use the following code to calculate a CRC-CCITT (0xFFFF): unsigned short Calculate_CRC_CCITT(const unsigned char* buffer, int size) { unsigned short tmp; unsigned short crc = 0xffff; for (int i=0; i < size ; i++) { tmp = (crc >> 8) ^ buffer[i]; crc = (crc << 8) ^ CRC_CCITT_TABLE[tmp]; } return crc; }
For Java Install: https://mvnrepository.com/artifact/com.github.snksoft/crc/1.0.2 Long returnValue = CRC.calculateCRC(Parameters.CCITT, "yourStringValue");
GetLogicalDrives() for loop
I am new to the win32 api and need help trying to understand how the GetLogicalDrives() function works. I am trying to populate a cbs_dropdownlist with all the available drives that are not in use. here is what I have so far. I would appreciate any help. void FillListBox(HWND hWndDropMenu) { DWORD drives = GetLogicalDrives(); for (int i=0; i<26; i++) { SendMessage(hWndDropMenu, CB_ADDSTRING, 0, (LPARAM)drives); } }
The function GetLogicalDrives returns a bitmask of the logical drives available. Here is how you would do it: DWORD drives = GetLogicalDrives(); for (int i=0; i<26; i++) { if( !( drives & ( 1 << i ) ) ) { TCHAR driveName[] = { TEXT('A') + i, TEXT(':'), TEXT('\\'), TEXT('\0') }; SendMessage(hWndDropMenu, CB_ADDSTRING, 0, (LPARAM)driveName); } } The code checks whether the i-th bit in the bitmask is not set to 1 or true.
GetLogicalDrives returns a bitmask and to inspect it you need to use bitwise operators. To see if drive A is in use: GetLogicalDrives() & 1 == 1 If drive A is unavailable, GetLogicalDrives() & 1 would yield 0 and the condition would fail. To check the next drive you'll need to use the next multiple of 2, GetLogicalDrives() & 2, GetLogicalDrives() & 4 and so on. You could use GetLogicalDriveStrings but this returns the inverse of what you want, all the used logical drives. I would build a table instead, and index into that: const char *drive_names[] = { "A:", "B:", ... "Z:" }; Then your loop could be: DWORD drives_bitmask = GetLogicalDrives(); for (DWORD i < 0; i < 32; i++) { // Shift 1 to a multiple of 2. 1 << 0 = 1 (0000 0001), 1 << 1 = 2 etc. DWORD mask_index = 1 << i; if (drives_bitmask & i == 0) { // Drive unavailable, add it to list. const char *name = drive_names[i]; // ... do GUI work. } }
Bitwise setting in C++
enum AccessSource { AccessSourceNull = 0x00000001, AccessSourceSec = 0x00000002, AccessSourceIpo = 0x00000004, AccessSourceSSA = 0x00000008, AccessSourceUpgrade = 0x00000010, AccessSourceDelta = 0x00000020, AccessSourcePhoneM = 0x00000040, AccessSourceSoft = 0x00000080, AccessSourceCR = 0x00000100, AccessSourceA = 0x00000200, AccessSourceE = 0x00000400, AccessSourceAll = 0xFFFFFFFF }; What is the value of AccessSourceAll ?? is it -1? or is it maximum value? I have a parameter ULONG x , whose default value is AccessSourceAll(that means access to all). How do i remove the access right of AccessSourceE only? How to add the access right of AccessSourceE again? If i have a particular value in x, then how do i know whether AccessSourceE is set or not?
The value of AccessSourceAll is (int)0xFFFFFFFF since enum is of type int in C. The unset just AccessSourceE use: x & ~AccessSourceE // to assign: x &= ~AccessSourceE; To add, use x | AccessSourceE // to assign: x |= AccessSourceE; To test, if (x & AccessSourceE) { ... }
I'm not sure it'll actually matter since it is a mask which will clearly have a bit set for each of the other values. If you are assigning it to a ULONG, it will be an unsigned type. To set/remove values use bitwise logic: x |= AccessSourceE; /* set SourceE */ x &= ~AccessSourceE; /* unset SourceE */ if(x & AccessSourceE) /* test SourceE */
You can use the ^ operator for this. For Example : unsigned long l_unValue = AccessSource::AccessSourceAll; l_unValue = l_unValue ^ AccessSource::AccessSourceE; The above statement will remove "AccessSourceE" from "AccessSourceAll".
How to make functions with flag parameters? (C++)
How could I make a function with flags like how Windows' CreateWindow(...style | style,...), for example, a createnum function: int CreateNum(flag flags) //??? { int num = 0; if(flags == GREATER_THAN_TEN) num = 11; if(flags == EVEN && ((num % 2) == 1) num++; else if(flags == ODD && ((num % 2) == 0) num++; return num; } //called like this int Number = CreateNum(GREATER_THAN_TEN | EVEN); Is this possible, and if so, how?
You can define an enum specifying "single bit" values (note that the enclosing struct is acting here only as a naming context, so that you can write e.g. MyFlags::EVEN): struct MyFlags{ enum Value{ EVEN = 0x01, ODD = 0x02, ANOTHER_FLAG = 0x04, YET_ANOTHER_FLAG = 0x08, SOMETHING_ELSE = 0x10, SOMETHING_COMPLETELY_DIFFERENT = 0x20 }; }; and then use it like this: int CreateNum(MyFlags::Value flags){ if (flags & MyFlags::EVEN){ // do something... } } void main(){ CreateNum((MyFlags::Value)(MyFlags::EVEN | MyFlags::ODD)); } or simply like this: int CreateNum(int flags){ if (flags & MyFlags::EVEN){ // do something... } } void main(){ CreateNum(MyFlags::EVEN | MyFlags::ODD); } You could also simply declare integer constants, but the enum is clearer in my opinion. Note: I updated the post to take some comments into account, thanks!
I upvoted orsogufo's answer, but I always liked doing the following for defining the values: enum Value{ EVEN = (1<<0), ODD = (1<<2), ANOTHER_FLAG = (1<<3), YET_ANOTHER_FLAG = (1<<4), SOMETHING_ELSE = (1<<5), SOMETHING_COMPLETELY_DIFFERENT = (1<<6), ANOTHER_EVEN = EVEN|ANOTHER_FLAG }; << is the shift operator. Incrementing the right side lets you generate sequential bit masks by moving the 1 over, one bit at a time. This has the same values for the bare flags, but reads easier to my eyes and makes it obvious if you skip or duplicate a value. I also like combining some common flag combinations when appropriate.
You can use const int like this: const int FLAG1 = 0x0001; const int FLAG2 = 0x0010; const int FLAG3 = 0x0100; // ... And when you use it: int CreateNum(int flags) { if( flags & FLAG1 ) // FLAG1 is present if( flags & FLAG2 ) // FLAG2 is present // ... } Of course you can put one or more flag in your flags using the | operator.
Use powers of two as the individual constants, like enum Flags { EVEN = 0x1, ODD = 0x2, GREATER_TEN = 0x4 }; and you use the logical and operator '&' for testing, like if( flags & GREATER_THAN_TEN) num = 11; if( (flags & EVEN) && (num % 2) == 1 ) num++; else if ( (flags & ODD) && (num % 2) == 0 ) num++; return num;
You've got your tests wrong. What you want is something like (flags & EVEN), where EVEN is an integer with a single bit set (1, 2, 4, 8, 16 - some power of 2). (The integer can be an int or an enum. You could have a macro, but that's generally not a good idea.) You can use the notation you listed, by overloading flags::operator==(flagvalue f), but it's a bad idea.
enum flags { EVEN = 0x0100, ODD = 0x0200, BELOW_TEN = 0x0400, ABOVETEN = 0x0800, HUNDRED = 0x1000, MASK = 0xff00 }; void some_func(int id_and_flags) { int the_id = id_and_flags & ~MASK; int flags = id_and_flags & MASK; if ((flags & EVEN) && (the_id % 2) == 1) ++the_id; if ((flags & ODD) && (the_id % 2) == 0) ++the_id; // etc } Illustrates masking of bit fields too which can be useful when you just need to bolt on a simplistic bit of extra functionality without adding any extra data structure.