0

我正在尝试学习 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() 没有显示它。

4

2 回答 2

1

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

"You pressed key "+ascii_code;

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

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

您需要使用C函数来构建您的字符串,或者,因为它被标记为C++use std::string

std::string message = "You pressed key ";
message += ascii_code;

SetWindowText(hwndStatic, TEXT(message.c_str()))
于 2013-02-21T08:20:53.620 回答
-1
"You pressed key "+ascii_code

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

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

(std::string("you pressed key ") + ascii_code).c_str();
于 2013-02-21T08:25:08.827 回答