WinAPI-按下显示键

WinAPI - show key pressed

本文关键字:显示 WinAPI-      更新时间:2023-10-16

我正在尝试学习WinAPI编程,但现在我遇到了这个问题-我想按键并显示它

LRESULT CALLBACK WndProc(HWND hwnd, UINT Msg, WPARAM wParam, LPARAM lParam){
    switch(Msg){
    case WM_CREATE:
        break;

    case WM_CHAR:
        char ascii_code = wParam;
        unsigned int key_state = lParam;
        SetWindowText(hwndStatic, TEXT("You pressed key "+ascii_code));
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    }
    return DefWindowProc(hwnd, Msg, wParam, lParam);
}

但输出很奇怪。。。它显示随机消息(每个键不同)。我做错了什么?

我试着调试它(一步一步),ascii_code包含按下的键,但TEXT()没有显示它。

不能像这样将字符添加在一起:

"You pressed key "+ascii_code;

这将取"You pressed key "的地址,例如1000,并将ascii码值添加到其中,例如95。

该函数将尝试打印内存地址1095处的字符串。它将打印所有内存,直到它碰到一个空字符(零)。这可以是任何东西。

您需要使用C函数来构建字符串,或者,由于标记为C++,请使用std::string

std::string message = "You pressed key ";
message += ascii_code;
SetWindowText(hwndStatic, TEXT(message.c_str()))
"You pressed key "+ascii_code

不能像那样连接字符串。"foo bar"的真正类型是const char[8]——一个原始的类似C的字符数组。当您对它应用+时,它会衰减为指向其第一个元素的指针,并且操作在指针上执行。这意味着您最终会根据指针最终指向的位置打印一些随机数据。

如果要将字符连接到字符串,则必须使用更智能的字符串表示,例如std::string:

(std::string("you pressed key ") + ascii_code).c_str();