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