WinAPI — показать клавишу нажата

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

Решение

Вы не можете добавлять символы вместе, как это:

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

Другие решения

"You pressed key "+ascii_code

Вы не можете объединять подобные строки. Реальный тип "foo bar" является const char[8] — необработанный C-подобный массив символов. Когда вы применяете + к нему, он распадается на указатель на свой первый элемент, и операция переносится на указатель. Это означает, что вы в конечном итоге распечатываете некоторые случайные данные, основываясь на том, где указатель заканчивается в конце.

Если вы хотите объединить символ в строку, вы должны использовать более интеллектуальное строковое представление, например std::string:

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

По вопросам рекламы [email protected]