WinAPI - 按下显示键

时间:2013-02-21 07:37:40

标签: c++ winapi keypress

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

2 个答案:

答案 0 :(得分:1)

您不能像这样添加字符:

"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()))

答案 1 :(得分:-1)

"You pressed key "+ascii_code

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

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

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