Key-Down und Key-Up unter Linux

S_Stefan

Grünschnabel
Hallo zusammen,

ich versuche gerade eine Konsolenanwendung in C unter Linux zu schreiben, die mir nicht nur den Tastendruck, sonder auch das Loslassen der Taste zurückgibt, also Key-Down und Key-Up.

Habe durch googlen und probieren folgenden Code zusammengestellt, für den aber leider sudo-Rechte von Nöten sind und noch viel schlimmer, der die Tastatur global aushebt, d.h. während das Programm läuft, andere Programme keine Tastatur mehr zur Verfügung haben. :confused:


Code:
#include <stdio.h>
#include <termios.h>
#include <fcntl.h>

int main() {
	struct termios orig, raw;
	unsigned char  c=0;
	int fd, i=0;
	
	if ((fd=open("/dev/console",O_RDONLY)) < 0)  perror("console");

	tcgetattr(fd, &orig);
	raw = orig;
	cfmakeraw(&raw);
	tcsetattr(fd, TCSANOW, &raw);

	sleep(1);

	printf("Tasten druecken und mit c abbrechen\n");
	do{
		read( fd, &c, 1 );
		printf( "code =  %i\n", c );
		i++;
	}while( c!=174 && i<50 );

	tcsetattr(fd, TCSANOW, &orig);
	
	return 0;
}


Vielen Dank schonmal!
Stefan
 
Hallo,

falls bei dir evdev läuft (muss im Kernel aktiviert sein) (kann man testen indem man mit cat /dev/eventX ausliest) kannst dus ja mal so probieren:

C:
#include <linux/input.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>

int main(int argc, char **argv)
{
    int ifd;
    struct input_event iev;

    if (argc != 2) {
        fprintf(stderr, "Usage: a.out <input_device>\n");
        return EXIT_FAILURE;
    }

    if ((ifd = open(argv[1], O_RDONLY)) == -1) {
        perror("Error in open()");
        return EXIT_FAILURE;
    }

    while (read(ifd, &iev, sizeof (iev)) > 0) {
        if (iev.type == EV_KEY && iev.value == 0)
            printf("Key release for key with code %d!\n", iev.code);
    }

    close(ifd);
    return EXIT_SUCCESS;
}

Braucht zwar immernoch root rechte, sollte aber die andren Programme nicht "stören".

Aufruf bspw.:
Code:
a.out /dev/input/event1

Gruß,
RedWing
 
Hallo RedWing,

dein Code funktioniert, danke!
Habe ihn noch etwas erweitert, so dass nun kein Echo mehr von der Tastatur kommt...

Nur schade, dass immer noch root Rechte benötigt werden. Hat dazu noch jemand eine Idee?

C:
#include <linux/input.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <termios.h>

int main(int argc, char **argv)
{
	int ifd;
	char c=0;
	struct input_event iev;
	struct termios old_io, new_io;
	
	if (argc != 2) {
		fprintf(stderr, "Usage: a.out <input_device>\n");
		return EXIT_FAILURE;
	}
	
	if ((ifd = open(argv[1], O_RDONLY)) == -1) {
		perror("Error in open()");
		return EXIT_FAILURE;
	}
	
	tcgetattr(STDIN_FILENO, &old_io);
	new_io = old_io;
	new_io.c_lflag &=~ ECHO;
	tcsetattr(STDIN_FILENO, TCSANOW, &new_io);
	
	while (read(ifd, &iev, sizeof (iev)) > 0) {
		if (iev.type == EV_KEY && iev.value == 0){
			printf("Key release for key with code %d!\n", iev.code);
			//tue dies...
		}
		if (iev.type == EV_KEY && iev.value == 1){
			printf("Key press for key with code %d!\n", iev.code);
			//...und das
		}
		if( iev.code == 46 ) //46 == c
			break;
	}
	
	close(ifd);
	tcsetattr(STDIN_FILENO, TCSAFLUSH, &old_io);
	return EXIT_SUCCESS;
}

Grüße,
Stefan
 
Hallo,

dir wird da wohl nix andres übrigbleiben als die Rechte des Devices zu ändern also
Code:
sudo chmod o+r datei

Falls dein System die Devices dynamisch verwaltet, also udev benutzt, musst du schauen wie man die Rechte dort vergibt.

Gruß,
RedWing
 
Zurück