Ir ao conteúdo

Posts recomendados

Postado

Caros, gostaria de saber como fazer um programa de console que ao mesmo tempo fique de prontidão esperando um texto entrar mas que se o usuário apertar seta pra cima ou seta pra baixo sem ENTER, saia no console uma frase dizendo que ele apertou a seta pra cima ou a seta pra baixo.
Fiz um esboço abaixo que não consegue fazer isso pois eu uso getline para pegar o texto acompanhado de ENTER mas não sei o que usar para pegar a tecla em C++ ao mesmo tempo que eu pego o texto que é inserido. Eu tenho que usar threads e dois loops ou não?

 

int (int argc, char *argv[]){
  string teclado;
  bool ativo = true;
  while(ativo){
     cout << ": ";
     getline(cin, teclado);
     if(teclado == "^[[A"){
        cout << "cima"<<endl;
     }
     if(teclado == "^[[B"){
        cout << "baixo"<<endl;
     }
     if(teclado == "sair"){
        exit(1);
     }
  }

  return 24;
}

 

  • Obrigado 1
Postado
6 horas atrás, sandrofabres disse:

Fiz um esboço abaixo que não consegue fazer isso pois eu uso getline para pegar o texto acompanhado de ENTER mas não sei o que usar para pegar a tecla em C++ ao mesmo tempo que eu pego o texto que é inserido. Eu tenho que usar threads e dois loops ou não?

 

 

Como getline para a execução do programa, você realmente teria que cirar uma thread para verificar as teclas que foram pressionadas, sem parar a execução do programa (teria que usar a API do windows ou uma biblioteca especifica, como kbhit).

  • Obrigado 1
Postado

@sandrofabres    você pode usar uma bibliotecas antiga , que é a 

#include <conio.h>

e que não faz parte do padrão c/c++ , e por isso pode ser que não funcione em outors pc's ,  e junto usar as funções 

                           /// em C++
#include <iostream>
#incude <conio.h>
using namespace std;
int main()
{
  string str = "";
  do                       /// repetir
  {
    if( kbhit() )          /// se pressionar alguma Tecla
    {
      a = (string)getch(); /// a armazena a tecla pressionada
      str += a;            /// concatenar as letras na palavra
      if( a == VK_RETURN)break;
    }
  }while (1 );
  cout << "Palavra " << str << endl;
  return 0;
}

ou a função SyncKeyState , que precisa também da biblioteca windows.h

y = GetAsyncKeyState(i);

ou ainda criar uma função própria usando os comandos avançados da linguagem c++ ,  tipo essa aqui que consegue pegar quase todas as teclas do teclado 

#include <stdio.h>
#include <cstring>
#include <iostream>
#include <windows.h>
using namespace std;
CHAR GetCh (VOID)
{
  HANDLE hStdin = GetStdHandle (STD_INPUT_HANDLE);
  INPUT_RECORD irInputRecord;
  DWORD dwEventsRead;
  CHAR cChar;

  while(ReadConsoleInputA (hStdin, &irInputRecord, 1, &dwEventsRead)) /* Read key press */
    if(   irInputRecord.EventType                      == KEY_EVENT
	      &&irInputRecord.Event.KeyEvent.wVirtualKeyCode != VK_SHIFT
	      &&irInputRecord.Event.KeyEvent.wVirtualKeyCode != VK_MENU
	      &&irInputRecord.Event.KeyEvent.wVirtualKeyCode != VK_CONTROL)
    {
      cChar = irInputRecord.Event.KeyEvent.uChar.AsciiChar;
	    ReadConsoleInputA (hStdin, &irInputRecord , 1, &dwEventsRead); /* Read key release */
	    return cChar;
    }
    if(VK_UP)return 172;
    return EOF;
}
int main()
{
  string str = "";
  char c;

  do
  {
    c = GetCh();

    printf("Retorno -> %c %d\n\n\n",c,c);
  }while( c != ' ' );
  return 0;
}

 

Postado
Em 30/04/2022 às 02:09, sandrofabres disse:

Eu tenho que usar threads e dois loops ou não?

 

Não, não precisa. No caso do Windows basta desligar o line input e o echo e tratar as teclas como aparecem mas apenas QUANDO aparecem. No Linux use o raw mode ao invés do cooked mode. Já postei vários exemplos disso aqui, e pode ver por exemplo em um programa que implementa menus, postando com 2 versões em C e duas em C++ em 

 

 

 

 

Não é exatamente o que quer mas o código mostra como fazer a programação e a leitura. Em Linux use ioctl e termio e pode ver direto no man. 

  • Obrigado 1

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...