Gedrückte Taste in String



  • Hallo Zusammen,

    ich habe eine Frage und zwar:

    Wie kann ich einen Tastendruck in einen String umwandeln?
    Also, wenn jetzt das Fenster eine F1-KeyDown bekommt, soll in dem String F1 stehen. Hat die WinAPI dafür irgend eine Function?

    Danke.



  • also erstmal, wenn du in einem MessageHandler auf eine WM_KEYDOWN nachricht reagierst:

    Wenn du spezialtasten in den string kopieren willst, musst du das selbst machen, d.h wenn VK_F1 gedrückt wird fügst du dem string ein "F1" an/kopierst es darein

    Wenn du Lexikalischen Input in den String kopieren willst, dann solltest du lieber auf die WM_CHAR oder WM_UNICHAR nachricht reagieren. der Zeichencode ist in wParam gespeichert. willst du UTF16 zeichen speichern, dann schau her:

    // erstmal ohne ende copypasta, damit man utf32 in utf16 verwandlen kann
    #define SURROGATE_PAIRS_HI_MIN  ((uint16_t)0xd800)
    #define SURROGATE_PAIRS_HI_MAX  ((uint16_t)0xdbff)
    #define SURROGATE_PAIRS_LO_MIN  ((uint16_t)0xdc00)
    #define SURROGATE_PAIRS_LO_MAX  ((uint16_t)0xdfff)
    #define SURROGATE_PAIRS_BIT_SZ  ((uint32_t)10)
    #define SURROGATE_PAIRS_MASK    (((uint16_t)1 << SURROGATE_PAIRS_BIT_SZ)-1)
    #define IsSurrogatePairsHi(_h)  (SURROGATE_PAIRS_HI_MIN == \
                          ((uint16_t)(_h) &~ (uint16_t)SURROGATE_PAIRS_MASK ))
    #define IsSurrogatePairsLo(_l)  (SURROGATE_PAIRS_LO_MIN == \
                          ((uint16_t)(_l) &~ (uint16_t)SURROGATE_PAIRS_MASK ))
    #define utf16_utf32(_h,_l) \
      (((((uint32_t)_h) & SURROGATE_PAIRS_MASK) << SURROGATE_PAIRS_BIT_SZ) + \
       (( (uint32_t)_l) & SURROGATE_PAIRS_MASK) +				\
       (  (uint32_t)0xffff))
    
    #define utf32_utf16(_wc32,_wcs)     \
    {									\
        if(0xffff < (uint32_t)_wc32)    \
        {					            \
            (_wcs)[0] = ((uint32_t)_wc32 >> SURROGATE_PAIRS_BIT_SZ ) +  \
            SURROGATE_PAIRS_HI_MIN ;					                \
            (_wcs)[1] = ((uint32_t)_wc32 & SURROGATE_PAIRS_MASK ) +		\
            SURROGATE_PAIRS_LO_MIN ;					                \
            (_wcs)[2] = 0;							                    \
        }                               \
        else                            \
        {								\
            (_wcs)[0] = ((uint32_t)_wc32) & 0xffff;				        \
            (_wcs)[1] = 0;							                    \
        }									                            \
    }
    ...
    	case WM_UNICHAR:
    	{
    	    if(wParam == UNICODE_NOCHAR) return TRUE;
            if((lParam & 0x80000000) == 0)
            {
                wchar_t buf[3];
                utf32_utf16(wParam,buf);
                // hier kannst du deinem string den Buffer buf anfügen/ ihn hineinkopieren
            }
            return 0;
    	}
    

    bei WM_CHAR fällt das etwas einfacher aus:

    case WM_CHAR:
    	{
            if((lParam & 0x80000000) == 0)
            {
                char buf = (char)(wParam & 0xff);
                // hier kannst du deinem string den Buffer buf anfügen/ ihn hineinkopieren
            }
    

    wenn du den Status des Keys mit GetAsyncKeyState prüfst, musst du dasselbe machen, wie auf reaktion auf WM_KEYDOWN - selber einen String anfügen/kopieren


Anmelden zum Antworten