WM_KEYDOWN, Werte aus der lparam?

Auf der MSDN-Website, für die WM_KEYDOWN-defition es sagt die bits lparam enthalten:

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 habe ich eine union mit struct innen wie diese:

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;
    };
};

Dann, wenn ich erhalte eine wm_keydown-Nachricht auf mein edit-box, die ich drucken Sie es wie folgt:

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());
}

Die Werte, die bekomme ich zurück, wenn ich Schreibe in meinem edit-box scheint das nicht richtig, manchmal sind die nReserved ist sogar 1 oder 0, und nRepeatCount ist IMMER 1, egal ob ich die Taste gedrückt halten für eine logn Zeit oder drücken Sie einfach die zufälligen Schlüssel.

Habe ich etwas falsch gemacht? wenn so was ist der ideale Weg, um diese Werte aus dem LPARAM?

  • Und auch die nExtended ist immer 0 auch fi i drücken Sie STRG/SHIFT.. wenn die Beschreibung sagt, dass es 1 sein soll für diejenigen, die (EDIT: gerade gemerkt ist die Rechte hand die Tasten Strg und shift, es scheint zu funktionieren jetzt
  • WARUM RepeatCount müssen kurz sein, wenn es immer zu sein scheint 1?
InformationsquelleAutor Kaije | 2010-11-08
Schreibe einen Kommentar