Перехват русских букв в консоли Win32
Добавлено: 27 июн 2004, 01:50
Имеем: консольное Win32-приложение, написанное в Borland C++ 5.02.
Необходимо: отлавливать нажатия клавиш на клавиатуре в русской раскладке.
Проблема: при использовании функции getch() все нормально, если вводятся цифры, знаки препинания и
строчные/прописные буквы латиницы - в этом случае getch() возвращает целочисленное значение ASCII-кода соответствующего символа. Но все меняется, когда мы переключаемся в режим ввода кириллицы - цифры и спец. символы вводятся по-прежнему нормально, а вот если нажимается какая-нибудь русская буква, то: 1) она генерирует два байта, причем первый байт - нулевой ('\0'), а второй равен ASCII-коду соответствующей русской буквы; 2) и даже это соблюдается не для всех клавиш: таким образом, например, не ловятся буквы 'х', 'ъ', 'ж', 'э', 'б' и 'ю' - вместо них возвращаются ASCII-коды символов "[];',." ... ........при компиляции того же самого под TC3 все проходит чисто и гладко... На ум уже всякое лезет - и UNICODE, и то, что getch() все-таки больше DOS-овская функция, а не форточная... тестилось под платформами Win98 SE и Win2000 SP4. Результат одинаковый.
Вопрос: можно ли как-то обойти поставленную проблему? Т.е. существуют ли другие функции, аналогичные getch() (аналогичные - т.е. ожидающие нажатия клавиши и возвращающие код символа без эха на экран), которые делали бы то же самое, но корректно? Вообще-то, можно, конечно, пропускать нулевой символ и анализировать следующий за ним, но буквы 'х', 'ъ', 'ж', 'э', 'б' и 'ю' мы все равно в таком случае не поймаем...
Необходимо: отлавливать нажатия клавиш на клавиатуре в русской раскладке.
Проблема: при использовании функции getch() все нормально, если вводятся цифры, знаки препинания и
строчные/прописные буквы латиницы - в этом случае getch() возвращает целочисленное значение ASCII-кода соответствующего символа. Но все меняется, когда мы переключаемся в режим ввода кириллицы - цифры и спец. символы вводятся по-прежнему нормально, а вот если нажимается какая-нибудь русская буква, то: 1) она генерирует два байта, причем первый байт - нулевой ('\0'), а второй равен ASCII-коду соответствующей русской буквы; 2) и даже это соблюдается не для всех клавиш: таким образом, например, не ловятся буквы 'х', 'ъ', 'ж', 'э', 'б' и 'ю' - вместо них возвращаются ASCII-коды символов "[];',." ... ........при компиляции того же самого под TC3 все проходит чисто и гладко... На ум уже всякое лезет - и UNICODE, и то, что getch() все-таки больше DOS-овская функция, а не форточная... тестилось под платформами Win98 SE и Win2000 SP4. Результат одинаковый.
Вопрос: можно ли как-то обойти поставленную проблему? Т.е. существуют ли другие функции, аналогичные getch() (аналогичные - т.е. ожидающие нажатия клавиши и возвращающие код символа без эха на экран), которые делали бы то же самое, но корректно? Вообще-то, можно, конечно, пропускать нулевой символ и анализировать следующий за ним, но буквы 'х', 'ъ', 'ж', 'э', 'б' и 'ю' мы все равно в таком случае не поймаем...