用键盘消息输出winapi LRESULT回调WndProc(HWND HWND,UINT消息,WPARAM WPARAM,LPARAM LPARAM) { HDC-HDC; PAINTSTRUCT-ps; TCHAR-szBuffer[1]; 开关(信息) { 案例WM_CHAR: szBuffer[1]=(TCHAR)wParam; cout

用键盘消息输出winapi LRESULT回调WndProc(HWND HWND,UINT消息,WPARAM WPARAM,LPARAM LPARAM) { HDC-HDC; PAINTSTRUCT-ps; TCHAR-szBuffer[1]; 开关(信息) { 案例WM_CHAR: szBuffer[1]=(TCHAR)wParam; cout,winapi,textout,Winapi,Textout,您的szBuffer是WndProc()的本地变量,默认情况下,C中的本地变量具有自动存储:每次WndProc()时调用时,将创建一个新的szBuffer,因此当到达WM_PAINT时,在WM_CHAR中键入的内容将丢失。您需要将szBuffer存储在其他地方,例如WndProc()外部,或者将其声明为静态的,这将保持缓冲区(但要注意,静态存储对于递归并不安全) 同样在C中,数组的第一个元素的索引是0,而不是1;行szBuffer[1]=(TCHAR)wParam;需要是szBuffer[0]=

您的
szBuffer
WndProc()
的本地变量,默认情况下,C中的本地变量具有自动存储:每次
WndProc()时调用
时,将创建一个新的
szBuffer
,因此当到达
WM_PAINT
时,在
WM_CHAR
中键入的内容将丢失。您需要将
szBuffer
存储在其他地方,例如
WndProc()
外部,或者将其声明为
静态的
,这将保持缓冲区(但要注意,静态存储对于递归并不安全)

同样在C中,数组的第一个元素的索引是0,而不是1;行
szBuffer[1]=(TCHAR)wParam;
需要是
szBuffer[0]=(TCHAR)wParam;
才能执行您想要的操作


由于我假设您是C新手,请参见Jonathan Potter关于在字符串中增加一个值为零的字符的评论(不是数字零的字符代码,而是数字0,或
'\0'
L'\0'
和其他GDI文本绘制函数不使用这些以null结尾的字符串,C中的所有其他函数都使用这些字符串



乔·威尔科克森的评论也是正确的
将给定的矩形排队等待重新绘制。在
WM_-PAINT
处理程序中使用它将使您总是一次又一次地收到
WM_-PAINT
消息,这将对性能产生负面影响,因为您的程序变得越来越大。

静态TCHAR szBuffer[2];
..
szBuffer[0]=(TCHAR)wParam;szBuffer[1]='\0';
@JonathanPotter GDI文本API的乐趣,它不仅不需要以null结尾的字符串,而且也不允许它们完全终止…(真的,我希望函数接受-1表示以null结尾,就像字符集转换函数一样:|)我猜此人来自其他编程语言(一种具有基于1的索引的语言),因此我试图在我的回答中反映这一点:/是的,了解以null结尾的字符串可能很重要。不要在WM_PAINT处理程序中调用InvalidateBurst()。InvalidateBurst()是您用来强制首先调用WM_PAINT的。不过,您可能希望将其放入WM_CHAR处理程序中。@andlabs:是的,最好从一开始就养成好习惯:)
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{

HDC             hdc;
PAINTSTRUCT     ps;
TCHAR           szBuffer[1];



switch (message)
{
case WM_CHAR:
    szBuffer[1] = (TCHAR) wParam;
    cout << wParam << " " << szBuffer[1] << " ";

    break;

case WM_PAINT:
    InvalidateRect(hwnd, NULL, TRUE);
    hdc = BeginPaint(hwnd, &ps);
    SelectObject(hdc,GetStockObject(SYSTEM_FIXED_FONT));
    TextOut(hdc, 1, 1, szBuffer, 1);
    EndPaint(hwnd, &ps);
    return 0;