0

WM_CHAR キーの値を取得しようとしており、取得したすべての値を単一の文字列に入れています。押されたキー値 2、3、4、および 5 を _tcscat と連結しようとしましたが、結果の TCHAR 文字列は次のようになります。「22232323423423452345」持ってる。

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{

      static PMSG   pmsg ;  
      int           i, iType ;
      int           StrLen;
      TCHAR     StrBuf[9];
      static TCHAR         tBuf[32];
      TCHAR     MyTchar[8] = TEXT ("A");
      WORD          wCharCode;

     switch (message)
    {
      case WM_PAINT:
        hdc = BeginPaint (hwnd, &ps) ;
        GetClientRect(hwnd, &rect);
        SelectObject (hdc, GetStockObject (SYSTEM_FONT)) ;
        SetBkMode (hdc, TRANSPARENT) ;          
        for (i = min (cLines, cLinesMax), cScreenLine=1; i>0 ; i--, cScreenLine++)
        {
             iType  =   pmsg[i-1].message == WM_CHAR ;


     if (!iType)
            {

              StrLen= wsprintf(StrBuf, TEXT("%s"), TEXT(" "));
     }
            else
     {
    wCharCode = (WORD)(pmsg[i-1].wParam & 0xffff);
          memcpy(&MyTchar, &wCharCode, 2);
                 StrLen = wsprintf(StrBuf[2], TEXT("%s"), &MyTchar);
    _tcscat(tBuf, MyTchar);


      }


      EndPaint (hwnd, &ps) ;

      return 0 ;

     case WM_DESTROY:
         PostQuitMessage (0) ;
         return 0 ;
 }

}
4

3 に答える 3

1

WM_PAINT メッセージ中のメッセージ処理がわかりません。おそらく、文字列を追跡できる別のメッセージとして WM_CHAR を処理したいと思うでしょう。

の外ではWndProc、 と が必要#include <string>;になりますstd::wstring keyPresses;

WM_CHAR は、WndProc 内の他のイベントと同じように処理できます。

case WM_CHAR:
    switch (wParam) 
    { 
        // First, handle non-displayable characters by beeping.
        case 0x08:  // backspace.
        case 0x09:  // tab.
        case 0x0A:  // linefeed.
        case 0x0D:  // carriage return.
        case 0x1B:  // escape.
        case 0x20:  // space.
            MessageBeep((UINT) -1); 
        break;

        // Next, handle displayable characters by appending them to our string.
        default:
            keyPresses += (wchar_t) wParam;
    } 
    break;

次に、 WM_PAINT メッセージ中に表示するなど、この文字列に対して任意の操作を行うことができます。

于 2012-11-28T03:09:18.927 に答える
0

文字列バッファを使用する前に、まずそれらをクリアする必要があります。1.ZeroMemery 2.memset を使用できます

または

TCHAR     StrBuf[9];
====>
TCHAR     StrBuf[9] = {0};

最後に、なぜ tBuf を静的変数として使用するのですか?

于 2012-11-28T03:04:20.470 に答える
0

C++ を使用しているため、std::string または std::wstring を使用します。はるかにシンプルで安全です(バッファオーバーフローはありません)

于 2012-11-28T02:45:16.037 に答える