Um getch() multiplataforma…

Há algum tempo mostrei uma pequena rotina que implementa a antiga função getch() que estava presente no header conio.h, dos antigos compiladores para MS-DOS. Essa função não existe na implementação padrão da libc e, portanto, tem que ser implementada através de alguma biblioteca à parte.

Abaixo, mostro a rotina para ambos Linux e Windows, ao estilo do que fiz para incentivá-los a não usar mais a função system() de stdlib.h:

#include <stdio.h>
#ifdef __linux
  #include <unistd.h>
  #include <termios.h>
#else
  #include <windows.h>
#endif

int getch(void)
{
#ifdef __linux
  struct termios newtios, oldtios;
  int ch;

  tcgetattr(STDIN_FILENO, &oldtios);

  /* Reusa o modo atual. */
  newtios = oldtios;

  /* Desabilita o modo canônico e o echo */
  newtios.c_lflag &= ~(ICANON | ECHO);
  tcsetattr(STDIN_FILENO, TCSANOW, &newtios);

  ch = getchar();

  /* Retorna o terminal ao normal. */
  tcsetattr(STDIN_FILENO, TCSANOW, &oldtios);

  return ch;
#else
  // Usa as funções do console do Windows para ler uma tecla.
  //
  HANDLE hStdin = GetStdHandle (STD_INPUT_HANDLE);
  INPUT_RECORD irInputRecord;
  DWORD dwEventsRead;
  int ch;

  /* Lê keypress... */
  while (ReadConsoleInputA(hStdin, &irInputRecord, 1, &dwEventsRead))
    if (irInputRecord.EventType == KEY_EVENT &&
	irInputRecord.Event.KeyEvent.wVirtualKeyCode != VK_SHIFT &&
	irInputRecord.Event.KeyEvent.wVirtualKeyCode != VK_MENU &&
	irInputRecord.Event.KeyEvent.wVirtualKeyCode != VK_CONTROL)
    {
      ch = irInputRecord.Event.KeyEvent.uChar.AsciiChar;

      /* ... e, finalmente, lê o key release! */
      ReadConsoleInputA (hStdin, &irInputRecord , 1, &dwEventsRead);
      return ch;
    }

  return EOF;
#endif
}

 

Anúncios

Deixe um comentário

Faça o login usando um destes métodos para comentar:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s