Не могу прочитать (! @ # $ ... и заглавные буквы) из консоли с ReadConsoleInput - PullRequest
0 голосов
/ 15 января 2012

написал это приложение, которое читает ввод с консоли.

for(; ; )
{


   GetNumberOfConsoleInputEvents(stdinInput, &numEvents);

   if (numEvents != 0) {

       INPUT_RECORD eventBuffer;

      ReadConsoleInput(stdinInput, &eventBuffer, 1, &numEventsRead);


        if (eventBuffer.EventType == KEY_EVENT) {

            if(eventBuffer.Event.KeyEvent.bKeyDown)
            {

                printf("%c",eventBuffer.Event.KeyEvent.uChar.AsciiChar);
                dataBuffer[bufferLen++] = eventBuffer.Event.KeyEvent.uChar.AsciiChar;
                dataBuffer[bufferLen]  = '\0';            

                if ( dataBuffer[bufferLen] == 99 || eventBuffer.Event.KeyEvent.uChar.AsciiChar == '\r' ) {
                printf("User Wrote: %s\n",dataBuffer);

                memset(dataBuffer,0,sizeof(dataBuffer));
                bufferLen = 0;
                }



            }
        }

    }
}

Он помещает данные в буфер, а затем распечатывает буфер. Проблема возникает, когда я использую Shift или CapsLock для написания заглавных букв или ! @ # $ % символов. Тогда он ничего не печатает.

Я пробовал что-то с кодом VK_LSHIFT, но не сработало.

Также, если попытаться написать что-то на другом языке, кроме английского, он напечатает что-то вроде этого ▒├╞▒├╞▒├│▒├│ Он не сможет распознать другой язык.

Может кто-нибудь дать мне подсказку о том, как исправить эти проблемы?

Спасибо!

1 Ответ

3 голосов
/ 15 января 2012

ReadConsoleInput возвращает события для каждого нажатия клавиши. Например, если вы наберете SHIFT+A, чтобы получить заглавную букву А, вы получите четыре ключевых события: SHIFT вниз, A вниз, A вверх, SHIFT вверх.

Клавиша SHIFT не имеет соответствующего кода ASCII, поэтому eventBuffer.Event.KeyEvent.uChar.AsciiChar устанавливается в ноль. Этот ноль оканчивает строку, которую вы строите в dataBuffer, поэтому вы не видите ничего, набранного после клавиши SHIFT.

Самое простое решение - игнорировать любое ключевое событие с нулевым кодом ASCII.

Кроме того, если вы хотите, чтобы это хорошо работало с иностранными языками, лучше использовать ReadConsoleInputW и eventBuffer.Event.KeyEvent.uChar.UnicodeChar. А еще лучше, скомпилируйте все как приложение Unicode.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...