Я пытаюсь научиться программировать на 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();