Oppure

Loading
28/07/11 20:21
giulioscatto
Salve a tutti,
premetto che ho utilizzato la parola 'keylogger' impropriamente, ora mi spiego.

Il programma che sto scrivendo necessita di conoscere i tasti premuti dall'utente: in pratica dovrebbe permettermi di inviare un particolare segnale MIDI (a seconda del tasto che premo) ad una specifica periferica MIDI.

Spulciando Internet con Gugol ho trovato essenzialmente soluzioni solo per Windows o solo per Linux. Quindi mi rivolgo a voi: avete qualche consiglio per rendere questa funzionalità cross-platform?

Grazie mille,
Giulio

________________________________________________________________
EDIT: dalla velocissima risposta di comina8 mi sono reso conto di aver omesso un'importante caratteristica: la pressione del tasto dev'essere catturata a presciendere dalla finestra in primo piano. Mi scuso per questa mancanza.
P.S. non ho problema con il MIDI, non so solo come implementare la funzionalità del catturare tasti premuti da tastiera pc, tipo keylogger.
Ultima modifica effettuata da giulioscatto 29/07/11 9:35
aaa
28/07/11 20:29
comina8
Per quanto riguarda la pressione dei tasti:

#if defined __WIN32 || defined __WIN64
#include <conio.h>
#else
char kbhit(void)
{
	struct termios Oldt, Newt;
	char Ch;
	char Oldf;

	tcgetattr(STDIN_FILENO,&Oldt);
	Newt=Oldt;
	Newt.c_lflag&=~(ICANON|ECHO);
	tcsetattr(STDIN_FILENO,TCSANOW,&Newt);
	Oldf=fcntl(STDIN_FILENO,F_GETFL,0);
	fcntl(STDIN_FILENO,F_SETFL,Oldf|O_NONBLOCK);
	Ch=getchar();
	tcsetattr(STDIN_FILENO,TCSANOW,&Oldt);
	fcntl(STDIN_FILENO,F_SETFL,Oldf);
	if(Ch!=EOF)
		{
			ungetc(Ch,stdin);
			return 1;
		}
	return 0;
}

char getch(void)
{
    struct termios Oldt, Newt;
    unsigned char Ch;

    tcgetattr(STDIN_FILENO,&Oldt);
    Newt=Oldt;
    Newt.c_lflag&=~(ICANON|ECHO);
    tcsetattr(STDIN_FILENO,TCSANOW,&Newt);
    Ch=getchar();
    tcsetattr(STDIN_FILENO,TCSANOW,&Oldt);
    return Ch;
}
#endif
...
char Tasto;
...
if(kbhit())
    Tasto=getch();
...
aaa
29/07/11 9:55
jack92
Ciao, purtroppo credo che soluzioni cross-platform, per sistemi Windows e Unix, non esistono per il semplice fatto che il "modo" di leggere la tastiera e differente. Es. in Win, si possano utilizzare le API e i vari Hook, mentre in sistemi Unix non saprei...
aaa
29/07/11 10:32
comina8
Ok grazie. Però stanotte ho pensato che avrei potuto definire i prototipi di funzioni e poi implementarle in un modulo che, a seconda del sistema, mi compilasse il codice proprio del sistema mantenendo gli stessi prototipi. Che possa funzionare? - giulioscatto - 29/07/11 12:13


Si questa è un'ottima scelta, ho implementato diverse librerie portabili con l'uso dei classici "ifdef".

Esempio:


#if defined __WIN32 || defined __WIN64 //se sono su windows

char PrendiTasto()
{
     return FunzionePerWindowsChePrendeITasti;
}

#else //se non sono su windows

char PrendiTasto()
{
    return FunzionePreLinuxChePrendeITasti;
}

#endif



Poi se hai detto che le funzioni le hai trovato ti basta inserirle in "PrendiTasto".
Per quanto riguarda le define sono automatiche, cercando su google trovi tutte quelle che vuoi.
Io per semplicità ho messo che se il sistema non è windows sarà per forza linux a priori, ma un "else if defined DEFINE_DI_LINUX" andrebbe anche bene.
aaa
03/08/11 8:07
ManfroC
Si è vero...L'unica soluzione è quella di usare #if e #else
aaa