2011-10-17 31 views
5

Me pregunto cómo aceptar la entrada de teclado y mouse en C++, usando Visual Studio 2010, para Windows 7 de 32 bits.Entrada de teclado/mouse en C++

--EDIT: Olvidé mencionar que necesito la entrada de teclado/mouse sin interrumpir el flujo del programa. Algo como un oyente. No quiero tener que pausar el programa y pedir una entrada, y luego hacer que el usuario lo escriba y presione enter. Lo que estoy buscando es más como:

Si el usuario presiona W, S, A, D -> sucede algo.

O bien: Si el usuario presiona el botón izquierdo en -> sucede algo.

Tengo que mencionar que todavía soy muy nuevo en la programación en general. Sé programación básica OOP, pero eso es todo. Definitivamente estoy seguro de que esto involucrará cosas que aún no conozco, y no me importa, solo te pido que lo expliques a fondo, y posiblemente dé un ejemplo para que sepa cómo usarlo.

Gracias.

+1

Si estás escribiendo una aplicación de consola de C++, que es un poco más difícil de lo que parece. Tendrá que escuchar la bomba de mensajes de Windows para varios mensajes e interpretarlos. Lo cual abre una lata de gusanos completa. –

Respuesta

13

entrada de teclado/ratón sin interrumpir el flujo

#include <windows.h> 
#include <iostream> 
using namespace std; 

int main() 
{ 
    HANDLE hIn; 
    HANDLE hOut; 
    COORD KeyWhere; 
    COORD MouseWhere; 
    COORD EndWhere; 
    bool Continue = TRUE; 
    int KeyEvents = 0; 
    int MouseEvents = 0; 
    INPUT_RECORD InRec; 
    DWORD NumRead; 

    hIn = GetStdHandle(STD_INPUT_HANDLE); 
    hOut = GetStdHandle(STD_OUTPUT_HANDLE); 

    cout << "Key Events : " << endl; 
    cout << "Mouse Events : " << flush; 

    KeyWhere.X = 15; 
    KeyWhere.Y = 0; 
    MouseWhere.X = 15; 
    MouseWhere.Y = 1; 
    EndWhere.X = 0; 
    EndWhere.Y = 3; 

    while (Continue) 
    { 
     ReadConsoleInput(hIn, 
         &InRec, 
         1, 
         &NumRead); 

     switch (InRec.EventType) 
     { 
     case KEY_EVENT: 
      ++KeyEvents; 
      SetConsoleCursorPosition(hOut, 
            KeyWhere); 
      cout << KeyEvents << flush; 
      if (InRec.Event.KeyEvent.uChar.AsciiChar == 'x') 
      { 
       SetConsoleCursorPosition(hOut, 
             EndWhere); 
       cout << "Exiting..." << endl; 
       Continue = FALSE; 
      } 
      break; 

     case MOUSE_EVENT: 
      ++MouseEvents; 
      SetConsoleCursorPosition(hOut, 
            MouseWhere); 
      cout << MouseEvents << flush; 
      break; 
     } 
    } 

    return 0; 
} 
+0

Muchas gracias por su tiempo. Encontré esto realmente útil. – Rohit

+0

Me preguntaba si podría mostrarme cómo puedo verificar cuándo se presiona/suelta una tecla individualmente, en lugar de los eventos clave en general. – Rohit

+0

aplicación de ejemplo: http://www.codeproject.com/KB/cpp/conslRndJkGn.aspx –

0

¿Windows o consola?

Si la consola, utilice:

std::cin >> myVar; 
+0

Lo siento, olvidé mencionar que estoy tratando de aceptar la entrada sin interrumpir el programa. He editado mi pregunta original para reflejar eso ahora. Gracias por tomarse el tiempo para responder. – Rohit

0

Si estás escribiendo una aplicación de consola, se puede usar scanf o cin para obtener la entrada del teclado. Las aplicaciones de consola no tienen soporte para el mouse.

Si está escribiendo una aplicación de GUI, construirá la aplicación a partir de los controles de Windows estándar que tienen comportamientos incorporados para la entrada del mouse y del teclado. Puede usar estos controles reutilizables tal como están, o puede aumentarlos para que se comporten exactamente como lo desea para su aplicación.

Por ejemplo, en una aplicación GUI, hay un control de edición estándar que puede usar y que el usuario puede escribir. Su programa recibe mensajes cuando el usuario ingresa texto en él, y en función de esos mensajes u otros eventos, puede recuperar el texto y hacer cosas con él según lo requiera su programa.

+0

Lo siento, olvidé mencionar que estoy tratando de aceptar la entrada sin interrumpir el programa. He editado mi pregunta original para reflejar eso ahora. Gracias por tomarse el tiempo para responder – Rohit

7

Hay una serie de conceptos relacionados detrás de esto.

En el nivel muy bajo, el teclado y el mouse son dispositivos de hardware que generan algunas "interrupciones" (en forma de señales eléctricas) a la CPU. El sistema operativo proporciona algunos controladores que manejan dichas interrupciones decodificando el protocolo específico de comunicación del dispositivo, y "estandarizando" (en el nivel del sistema operativo) esas señales en la forma de eventos.

Con "aplicaciones de consola", el sistema operativo maneja esos eventos (el teclado en particular) llenando un búfer de entrada (esencialmente un char []) accesible como una "secuencia de caracteres prácticamente infinita" (complicado nombre para "archivo") llamado "CON", imitando así el "modelo de teletipo infinito" de las computadoras de los primeros días. En un programa en C++, los asociados de la biblioteca estándar del programa -al startup a que "archivo" y los std::cinstd::coutcorriente objetos, para que pueda leer la secuencia de caracteres de entrada con los std::istream funciones y operadores.

Desafortunadamente, con las "aplicaciones gráficas", no hay un "modelo de los primeros días" para imitar, y los "eventos" quedan disponibles como la estructura nativa del sistema operativo. Diferente sistema operativo difiere en la forma en que se representan y manejan dichos eventos, pero se puede ver cierta similitud. Para Windows (ya que su pregunta es sobre), un programa típico recupera esos eventos en secuencia con un "bucle de mensaje" en el que llama a ciertas API de sistema operativo. En ese ciclo, el programa típico también llamará a otra API de sistema operativo para enviar esos eventos al procedimiento apropiado de "devolución de llamada", asociado a una "ventana" creada previamente. Ese procedimiento de devolución de llamada tiene que detectar el código de evento, emitir el parámetro según corresponda y administrarlos realizando la acción requerida.

Se puede ver un detalle más preciso con un tutorial de programación WIN32 como http://www.winprog.org/tutorial/. La mayor parte del código es esencialmente C, ya que C es el idioma que formaliza la API. Para C++, se han escrito varias bibliotecas para representar objetos del sistema operativo en forma de clases C++, y se asignan las API del sistema operativo a los miembros de las clases. Estas bibliotecas pueden ser específicas del sistema operativo (como MFC, WTL ...) o "multiplataforma" (existen en diferentes versiones, mapeando la API de varios sistemas operativos en una misma interfaz C++) como WxWidget, Qt, Gtk, Fltk ...

Espero que esto pueda darte más consejos para pensar.

+0

Muchas gracias ^^. Esto realmente ayuda cuando se trata de la teoría detrás de esto. – Rohit

+0

Útil, y creo, necesario para OP. ++ –

Cuestiones relacionadas