2012-11-28 1 views
0

WM_CHAR 키의 값을 캡처 한 다음 캡처 된 모든 값을 단일 문자열에 넣으려고합니다. 내가 눌린 키 값을 2, 3, 4와 5를 _tcscat로 연결하려고 시도한 결과, TCHAR 문자열은 "22232323423423452345"처럼 보입니다. TCHAR 문자열을 2345와 같이 만드는 방법을 알고 싶습니다. 다음 코드는 I입니다. 있다.누른 WM_Char 키 값 연결 win32API

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

} 

답변

0

C++을 사용하고 있으므로 std :: string 또는 std :: wstring을 사용하십시오. 훨씬 간단하고 안전합니다 (버퍼 오버 플로우 없음)

0

문자열 버퍼를 사용하기 전에 먼저 버퍼를 지워야합니다. 당신은 사용할 수 있습니다 1. ZeroMemery 2. memset 함수

그리고 나

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

마지막으로, 왜 유 TBUF 정적 VAR로 사용할 수 있습니까?

+0

tBuf가 정적 인 이유는 중지 집중이 필요하고 반환 키를 누를 때 함수에 문자열을 전달했기 때문입니다. – user651659

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 메시지 중 displaying it을 포함하여,이 문자열에 좋아한다 무엇 이건을 조작 할 수 있습니다.

+0

답변 해 주셔서 감사합니다. 그것은 WM_CHAR 아래에 아무것도 넣을 수없는 것, 내 wm_paint 어떤 메시지 wm_char 아래에 어떤 메시지와 함께 페인트하지 않을 것 같습니다. 또한, 눌려진 키의 결과 문자열은 2345가 아닌 22334455입니다. 여러분이 가지고있는 모든 제안에 감사드립니다! – user651659