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