Quiero comprobar si el usuario ha presionado el CAMBIO clave, cuando se inicia el programa. (Que significa, presione hacia abajo la CAMBIO clave antes de iniciar el programa) Es un sencillo programa de consola, nada relacionado con X.

Este tal vez similar a la de Win32 GetKeyboardState() función.

Quiero saber si me pueden hacer esto y cómo, pero no los pros y los contras con el acceso a la terminal directamente.

El idioma que estás usando?
C. _ _ _ _ _ _ _ _

OriginalEl autor Xiè Jìléi | 2010-09-06

4 Comentarios

  1. -9

    No se puede.

    La tecla mayús no está considerado como un personaje clave, por lo que incluso si el acceso a la terminal directamente, usted no será capaz de detectar esta clave.

    Tal vez usted no debería tener que. Imaginemos por ejemplo, que usted está usando un teclado de EE.UU. donde los números son accesibles en la fila superior sin modificadores, y también la comprobación de la tecla shift. Otras personas con diseño de teclado puede tener a cambio del uso de los modificadores de acceso de los números. Si su programa de reaccionar a este cambio de prensa, luego de que su programa es, básicamente, inutilizable. Lo mismo se aplica para otros teclas modificadoras : puede detectar algunos de ellos sólo después de un carácter normal se pulsa la tecla. O peor, puede que sea necesario utilizar la tecla mayús para el uso de «enter» para ejecutar el programa.

    También, lo de la tecla shift ¿quieres controlar ? el uno en la máquina local, o aquella en la que el usuario es ? recuerde que SSH existe y es comúnmente utilizado para acceder a un pseudoterminal de forma remota.

    Si eres root y quieres monitorear la tecla Shift en el local de la máquina, se puede leer la evdev dispositivos para eventos sobre la tecla mayús. Pero esto sólo es posible porque automática de repetición de teclas, por lo que no detectar un cambio de tecla que se pulsa a la derecha antes de ejecutar el programa, pero sólo unos pocos segundos antes.

    Por supuesto, usted no puede hacer eso en la máquina remota, que sería un fallo de seguridad.

    Y de todos modos, ¿por qué quieres hacer eso ? no una aplicación X ser la cosa correcta a hacer en tu caso ?

    Es un propósito general invocador de comandos, mientras que CAMBIO la tecla está pulsada, el invocador entrará en el modo de configuración. A pesar de que hay otra manera de hacer esto, por ejemplo una línea de comandos --conf opción, bien, sabiendo que es imposible es suficiente, voy a intentarlo de otra manera.
    es generalmente mala forma de empezar una respuesta con «no se puede», porque por lo general es una señal de que la contestadora del invalidar el autor de la pregunta pregunta de manera consecutiva. Además, es muy injusto asumir que usted tiene el derecho a dar a nadie permiso para hacer algo. Peor aún, si alguien entra de nuevo y muestra baltently cómo se «puede», que te hace ver realmente… malo. De todos modos, he escrito comentarios como estos antes. Realmente no es un concepto nuevo. Y, yo no escribí una respuesta porque NO SÉ, un poco de humildad puede ir una manera larga larga 😉
    […]Tal vez usted no debería tener que. […] Si su programa de reaccionar a este cambio de prensa, luego de que su programa es, básicamente, inutilizable.[…] Salvo que esto sólo es válido para la GUI de procesamiento. Para todo lo demás, «si el programa no reaccionar a este cambio de prensa, luego de que, básicamente, inutilizable.» es decir. los controles de la cámara, aplicaciones de edición de imágenes, etc. por no hablar de procesamiento de teclas como ctrl o alt o la tecla esc. En resumen: nadie pidió su opinión basada en su experiencia limitada evidencia con frases tales como «¿por qué quieres hacer eso?» y «no se puede».

    OriginalEl autor

  2. 28

    Creo que no hay una manera de hacer esto. La cosa es que usted tendría que leer directamente desde el teclado del dispositivo. Usted no estaría recibiendo el aporte de la terminal. Tengo el mismo problema. Tengo un programa que se ejecuta (en el fondo) y quiero saber si el usuario se mantiene presionada la tecla mayús.

    Creo que esto es posible y un lugar para empezar podría ser la /dev/input/by-path/*-kbd.

    Este archivo no dar entrada cada vez que se pulsa una tecla o reptadly si se mantiene presionada por lo que podría ser digno de una mirada. (Trate de gato /dev/input/by-path/*-kbd)

    Si no que esta cifra fuera me encantaría saber cómo lo hizo.

    EDIT: he encontrado la solución

    He descubierto la manera de hacer esto. Mi programa es el siguiente:

    #include <stdlib.h>
    #include <stdio.h>
    #include <linux/input.h>
    void usage ( int argc, char *argv[] )
    {
    printf("Usage:\n\t%s key\n\nvalid keys are:\n\tlshift\t- Left Shift key\n" , argv[0]);
    exit(EXIT_FAILURE);
    }
    int main ( int argc, char *argv[], char *env[] )
    {
    if ( argc != 2 )    usage(argc, argv);
    int key;
    if ( strcmp(argv[1], "lshift") == 0 )       key = KEY_LEFTSHIFT;
    else if ( strcmp(argv[1], "rshift") == 0 )  key = KEY_RIGHTSHIFT;
    else if ( strcmp(argv[1], "lalt") == 0 )    key = KEY_LEFTALT;
    else if ( strcmp(argv[1], "ralt") == 0 )    key = KEY_RIGHTALT;
    else if ( strcmp(argv[1], "lctrl") == 0 )   key = KEY_LEFTCTRL;
    else if ( strcmp(argv[1], "rctrl") == 0 )   key = KEY_RIGHTCTRL;
    FILE *kbd = fopen("/dev/input/by-path/platform-i8042-serio-0-event-kbd", "r");
    char key_map[KEY_MAX/8 + 1];    // Create a byte array the size of the number of keys
    memset(key_map, 0, sizeof(key_map));    // Initate the array to zero's
    ioctl(fileno(kbd), EVIOCGKEY(sizeof(key_map)), key_map);    // Fill the keymap with the current keyboard state
    int keyb = key_map[key/8];  // The key we want (and the seven others arround it)
    int mask = 1 << (key % 8);  // Put a one in the same column as out key state will be in;
    return !(keyb & mask);  // Returns true if pressed otherwise false
    }

    El mensaje de información que falta (yo soy demasiado perezoso). Pero, esencialmente, el primer argumento se compara con una lista de las teclas y la tecla apropiada identificador se utiliza. Devuelve true si la tecla está presionada y false si no.

    Por Favor Nota

    Tendrá que cambiar el nombre del dispositivo de teclado. No conozco una manera de encontrar el teclado predeterminado del dispositivo. (si usted sabe que me encantaría saber 😉 )

    Esto funciona muy bien: yo lo uso para iniciar el inicio automático de Xorg si me mantenga presionada la tecla mayús.

    Gracias por la información, voy a tratar algunos días más tarde.
    Este programa necesita privilegios de root, de lo contrario segfaults en mi máquina. Esto es debido a que los permisos para el teclado de archivo de dispositivo (por CIERTO, es el mismo platform-i8042-serio-0-event-kbd aquí, así que tal vez, al menos, cada PC tiene?). Mediante la ejecución de sudo xxd /dev/input/by-path/platform-i8042-serio-0-event-kbd vi que el archivo «crece» por otro sizeof(keymap) cada vez que el teclado de los cambios de estado.

    OriginalEl autor

  3. 2

    He encontrado una manera muy sencilla a través de gtk/gdk.

    int main ( int argc, char *argv[], char *env[] )
    {
    gtk_init(&argc, &argv);
    GdkModifierType button_state;
    gdk_window_get_pointer(NULL, NULL, NULL, &button_state);
    if(button_state & GDK_CONTROL_MASK) {
    printf("ctrl key is pressed");
    }
    }

    OriginalEl autor

  4. 2

    AFAIK esto no puede hacerse sin Xlib (aka. X) con la raíz de nivel de permisos.
    El uso de XQueryKeymap() hace lo que usted desea. sin embargo, usted señaló que X no puede ser utilizado. Independientemente, de apertura de la pantalla de conexión también será requerida.

    Display* dpy = XOpenDisplay()
    char keys_return[32];
    XQueryKeymap( dpy, keys_return );
    KeyCode kc2 = XKeysymToKeycode( dpy, XK_Shift_L );
    bool bShiftPressed = !!( keys_return[ kc2>>3 ] & ( 1<<(kc2&7) ) );
    XCloseDisplay(dpy);

    OriginalEl autor

Dejar respuesta

Please enter your comment!
Please enter your name here