我试图捕获WM_CHAR键的值,然后将所有捕获的值放入一个字符串中。我试图用_tcscat连接按下的键值2,3,4和5,结果TCHAR字符串看起来像这样“22232323423423452345”我想知道如何使TCHAR字符串看起来像2345.以下是我的代码有
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 :(得分:1)
我不理解WM_PAINT消息中的消息处理。您可能希望将WM_CHAR作为单独的消息处理,您可以在其中跟踪字符串。
在WndProc
之外,您需要#include <string>;
和std::wstring keyPresses;
然后可以像处理WndProc中的任何其他事件一样处理WM_CHAR。
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。
答案 1 :(得分:0)
由于您使用的是C ++,请使用std :: string或std :: wstring。它会更简单,更安全(没有缓冲区溢出)
答案 2 :(得分:0)
在使用字符串缓冲区之前,应先清除它们。 您可以使用 1. ZeroMemery 2. memset
和或
TCHAR StrBuf[9];
====>
TCHAR StrBuf[9] = {0};
最后,为什么你使用tBuf作为静态var?