Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > Определение кода клавиши


Автор: NewLine 23.10.2006, 13:45
Привет всем.
В своем MDI приложении я с помощью события OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
Отлавливаю коды клавиш.
Как я понял коды клавиши не меняются в зависимости от того, нажаты ли клавиши Shift или CapsLock или нет???
Я конечно могу это фиксировать с помощью GetKeyState(),
Код

void app::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
   bool is_shift = (GetKeyState(VK_LSHIFT) & 0x8000 || GetKeyState(VK_RSHIFT) & 0x8000);
}

 но проблемма в том, что мне необходимо код этой клавиши отправить на другой компьютер и соответсвенно там отобразить.
Поэтому нужно как-то сразу фиксировать большой и маленький регистр.
Подскажите кто знает, как это зафиксировать?
Спасибо.

Добавлено @ 13:52 
Я так понял, что нужно отдельно для управляющих клавиш типа (Shift, up_down и.т.д)
OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
и отдельно для  символов???
OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) 

Автор: Earnest 23.10.2006, 14:08
Да

Добавлено @ 14:14 
Если тебе все равно, какой SHIFT нажат - лучше проверять GetKeyState (VK_SHIFT).

Автор: NewLine 23.10.2006, 16:18
Скажите пожалуйста.
Если от OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
UINT nChar Я обрабатывал с помощью
ToAscii(nChar, MapVirtualKey(nChar, 0), keyboardState,&BufChar, 0);

А как обрабатывать от 
OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) 
UINT nChar
ToAscii работает, но как-то не так.
А что-то другие функции я не нашел.

Это наверное не правильно, но тупое преобразование CString(nChar) работает.

Спасибо.



Автор: Earnest 23.10.2006, 18:51
Цитата(NewLine @  23.10.2006,  17:18 Найти цитируемый пост)
ToAscii работает, но как-то не так.

ToAscii преобразует виртуальный код в код символа. Так что в случае OnChar тебе просто ничего не надо делать. 

Цитата(NewLine @  23.10.2006,  17:18 Найти цитируемый пост)
Это наверное не правильно, но тупое преобразование CString(nChar) работает.

Ну почему неправильно, CString имеет в том числе и конструктор от char...
Дело скорее в том, что есть и менее "тупые" пути. Вопрос в том, что ты хочешь получить. Если строку из символа - то сойдет и твой метод. А можно, например, так (всего-то):
Код

TCHAR str[2];
str[0] = nChar;
str[1] = 0;

И получается ровно то же самое, только без конструирования строки (выделения динамической памяти, etc).

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)