title: WM_KEYDOWN, getting values from the lparam?
body: <p>On MSDN, for the WM_KEYDOWN defition it says the bits of lparam contain: </p>
  
  <pre><code>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.
  </code></pre>
  
  <p>(<a href="http://msdn.microsoft.com/en-us/library/ms646280%28VS.85%29.aspx" rel="nofollow">http://msdn.microsoft.com/en-us/library/ms646280%28VS.85%29.aspx</a>)</p>
  
  <p>So i created a union with a struct inside like this:</p>
  
  <pre><code>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;
      };
  };
  </code></pre>
  
  <p>Then when i recieve a wm_keydown message on my edit box, i print it like this:</p>
  
  <pre><code>if (msg == WM_KEYDOWN)
  {
      std::tstringstream ss;
  
      KeyState ks;
      ks.lparam = lparam;
  
      ss &lt;&lt; "Key: " &lt;&lt; (TCHAR)wparam &lt;&lt; ", Val: " &lt;&lt; (UINT)wparam &lt;&lt; ", nRepeatCount: " &lt;&lt; ks.nRepeatCount &lt;&lt; 
          ", nScanCode: " &lt;&lt; ks.nScanCode &lt;&lt; ", nExtended: " &lt;&lt; ks.nExtended &lt;&lt; ", nReserved: " &lt;&lt; ks.nReserved &lt;&lt; 
          ", nContext: " &lt;&lt; ks.nContext &lt;&lt; ", nPrev: " &lt;&lt; ks.nPrev &lt;&lt; ", nTrans: " &lt;&lt; ks.nTrans;
  
      SetWindowText(hOut, ss.str().c_str());
  }
  </code></pre>
  
  <p>The values that i get back when i'm typing in my edit box don't seem correct, sometimes the nReserved is even 1 or 0, and nRepeatCount is ALWAYS  1 no matter if i hold down the key for a logn time or just press random keys.</p>
  
  <p>Have i done something wrong? if so whats the ideal way to get these values from the LPARAM?</p>