Richard R wrote: > Hello, I dont know how to extract data from a LParam value from a WM_KEYDOWN > message. Documentation says that LPARAM "Specifies the repeat count, scan > code, extended-key flag, context code, previous key-state flag, and > transition-state flag" well all I get is one big number. Since this > statement used "and" instead of "or" this makes me wonder if there is some > type of byte calculations that need to be done to extract each piece? Here > are the values
Yes. The numbers (0-15, 16-23, etc.) refer to the bits within the 32-bit lParam. > 0-15 Specifies the repeat count. The value is the number of times the > keystroke is repeated as a result of the user holding down the key. Get the first 16 bits with the LoWord function. > 16-23 Specifies the scan code. The value depends on the original equipment > manufacturer (OEM). Get the low byte of the upper 16 bits with the Lo (not Low!) and HiWord functions. > 24 Specifies 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 Specifies the context code. The value is always 0 for a WM_KEYDOWN > message. > 30 Specifies the previous key state. The value is 1 if the key is down > before the message is sent, or it is 0 if the key is up. > 31 Specifies the transition state. The value is always 0 for a WM_KEYDOWN > message. All these are in the high byte, which you can get with the Hi (not High!) and HiWord functions. Then use bitwise arithmetic to get the bits. Suppose the whole byte is in a variable named b. "b and $1" gets you bit 24 by itself. Bit 29 is "(b shr 5) and $1". Get bits 30 and 31 by changing that 5 to 6 and 7, respectively. (For bit 31, the "and $1" part isn't necessary anymore, because there aren't any other bits to mask out.) > The lparam value I get in my function that hooks key strokes returns 983041. > Is this bogus data or should it have returned a 2 digit number as above? That value is $000f0001. Hexadecimal format makes it easy to separate the bytes visually. The lower 16 bits have the value 1, so the repeat count is 1. The third byte is $0f = 15; that's the scan code. The remaining bits are all zero. -- Rob __________________________________________________ Delphi-Talk mailing list -> [email protected] http://www.elists.org/mailman/listinfo/delphi-talk
