WM_KEYDOWN



  • Das habe ich auch gesehen, aber wie bekomme ich jetzt die entsprechenden Werte aus dem lParam? Muss ja ganz trivial sein, wenn man sich nicht mal genötig sah ein Beispiel auf der msdn anzugeben.


  • Mod

    Mit & und >>



  • Mensch jetzt lasst euch doch nicht alles aus der Nase ziehen. Gehts noch ein wenig genauer?

    Ergibt folgendes also meinen extended Wert?

    bool isExtended = lParam << 24;
    

  • Mod

    Nö.

    bool isExtended = (lParam & 0x1000)!=0;
    

    PS: Das sind Basics... muss man Dir alles vorkauen?



  • Martin Richter schrieb:

    bool isExtended = (lParam & 0x1000)!=0;
    

    PS: Das sind Basics... muss man Dir alles vorkauen?

    Eigentlich ist 0x1000 etwas wenig für Bit 24 ?


  • Mod

    Stimmt fehlen 3 Nullen. Ich habe nur an 3 Bytes im Shift gedacht und danmn sind 3 Nullen draus geworden. Sorry!



  • Martin Richter schrieb:

    Stimmt fehlen 3 Nullen.

    :edit stimmt so.

    zum selbst nachzählen:

    1000 0000 0000 0000 0000 0000 = 0x800000

    1 0000 0000 0000 0000 0000 0000 = 0x1000000

    Weil das Zählen von Nullen irgendwie lästig ist, sollte man das
    evtl. doch mit shiften (nach rechts!), oder noch besser mit Bitfeld lösen.

    struct Bits {
        WORD nRepeatCount: 16;
        BYTE nScanCode : 8;
        BYTE nExtended : 1;
        BYTE nReserved : 4;
        BYTE nContext : 1;
        BYTE nPrevious : 1;
        BYTE nTransition : 1;
      };
    
    union KeyInfo
    {  
      LPARAM lParam;
      Bits bits;  
    };
    


  • merano schrieb:

    zum selbst nachzählen:

    1000 0000 0000 0000 0000 0000 = 0x800000

    Wie war das mit den Grundlagen 😉

    Fängt man nicht bei 0 an zu zählen?



  • Belli schrieb:

    Fängt man nicht bei 0 an zu zählen?

    Ja, stimmt 😉

    Wenn man sich den Vorschlag mit dem Bitfeld ansieht braucht man
    nicht zählen.

    merano schrieb:

    struct Bits {
        WORD nRepeatCount: 16;
        BYTE nScanCode : 8;
        BYTE nExtended : 1;
    

    Für das Bit nExtended berechnet ergibt das 16+8+1 = 25 😃



  • Das mit dem Bitfield ist keine gute Idee. Erstens weil das Layout eines Bitfield vollkommen implementation defined ist und zweitens weil der union Hack Undefined Behavior ist.

    Ich würd sowas in der Art verwenden:

    template <unsigned int n, unsigned int N = 1U>
    unsigned int extractBits(unsigned int value)
    {
      static_assert(n + 1U > N, "does not compute");
      return (value >> (n + 1U - N)) & ((1U << N) - 1U);
    }
    
    unsigned int bla = extractBits<4, 3>(42U);
    

Anmelden zum Antworten