WM_KEYDOWN, getting values ​​from lparam?

In MSDN, to verify WM_KEYDOWN, it is indicated that the lparam bit contains:

Bits Meaning 0-15 The repeat count for the current message. The value is the number of times the keystroke is autorepeated as a result of the user holding down the key. If the keystroke is held long enough, multiple messages are sent. However, the repeat count is not cumulative. 16-23 The scan code. The value depends on the OEM. 24 Indicates whether the key is an extended key, such as the right-hand ALT and CTRL keys that appear on an enhanced 101- or 102-key keyboard. The value is 1 if it is an extended key; otherwise, it is 0. 25-28 Reserved; do not use. 29 The context code. The value is always 0 for a WM_KEYDOWN message. 30 The previous key state. The value is 1 if the key is down before the message is sent, or it is zero if the key is up. 31 The transition state. The value is always 0 for a WM_KEYDOWN message. 

( http://msdn.microsoft.com/en-us/library/ms646280%28VS.85%29.aspx )

So, I created an alliance with such a structure inside:

 union KeyState { LPARAM lparam; struct { unsigned nRepeatCount : 15; unsigned nScanCode : 8; unsigned nExtended : 1; unsigned nReserved : 4; unsigned nContext : 1; unsigned nPrev : 1; unsigned nTrans : 1; }; }; 

Then, when I receive the wm_keydown message in the edit window, I print it as follows:

 if (msg == WM_KEYDOWN) { std::tstringstream ss; KeyState ks; ks.lparam = lparam; ss << "Key: " << (TCHAR)wparam << ", Val: " << (UINT)wparam << ", nRepeatCount: " << ks.nRepeatCount << ", nScanCode: " << ks.nScanCode << ", nExtended: " << ks.nExtended << ", nReserved: " << ks.nReserved << ", nContext: " << ks.nContext << ", nPrev: " << ks.nPrev << ", nTrans: " << ks.nTrans; SetWindowText(hOut, ss.str().c_str()); } 

The values ​​that I return when I type in my edit window do not seem correct, sometimes nReserved is 1 or 0, and nRepeatCount is ALWAYS 1, regardless of whether I hold the key for login time or just press random keys.

Did I do something wrong? if so, what is the ideal way to get these values ​​from LPARAM?

+4
source share
2 answers

Well, firstly, 0-15 is 16 bits, not 15.

+12
source

Yes, it's easy to make a mistake (cf 500 answer). I would just use bitmaps and bit shifts.

Eg. NRepeat = lparam and 0xFFFF;

0
source

All Articles