Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Keylogger cross-platform.
Forum - C/C++ - Keylogger cross-platform.

Avatar
giulioscatto (Normal User)
Rookie


Messaggi: 37
Iscritto: 03/08/2009

Segnala al moderatore
Postato alle 22:21
Giovedì, 28/07/2011
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 il 29/07/2011 alle 11:35
PM
Avatar
comina8 (Normal User)
Pro


Messaggi: 86
Iscritto: 18/06/2011

Up
1
Down
V
Segnala al moderatore
Postato alle 12:32
Venerdì, 29/07/2011
Testo quotato


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:

Codice sorgente - presumibilmente C++

  1. #if defined __WIN32 || defined __WIN64 //se sono su windows
  2.  
  3. char PrendiTasto()
  4. {
  5.      return FunzionePerWindowsChePrendeITasti;
  6. }
  7.  
  8. #else //se non sono su windows
  9.  
  10. char PrendiTasto()
  11. {
  12.     return FunzionePreLinuxChePrendeITasti;
  13. }
  14.  
  15. #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.

Ok, esattamente quello che stavo pensando :) Grazie mille! - giulioscatto - 29/07/11 12:37
Sbaglio o Linux utilizza una mappatura diversa rispetto a Windows? Per esempio, lo Shift Sinistro in Linux è 42 mentre per WIn è 160. Avete dei consigli a riguardo? Pensavo di inventare una mappatura (che verrà usata dall'utente finale) che verrà tradotta a seconda del OS usato. Ci sono alternative? - giulioscatto - 29/07/11 17:50
No non sbagli..ma per questo basta usare delle semplici define (che tra l'altro aiutano anche a scrivere il codice) es. #define A 65 e dentro ogni "ifdef" le definisci tutte ma in modo diverso... - comina8 - 29/07/11 17:53
Ah si, ecco. Questo è sicuramente una soluzione più diretta. Grazie! - giulioscatto - 29/07/11 17:57
PM
Avatar
comina8 (Normal User)
Pro


Messaggi: 86
Iscritto: 18/06/2011

Up
0
Down
V
Segnala al moderatore
Postato alle 22:29
Giovedì, 28/07/2011
Per quanto riguarda la pressione dei tasti:

Codice sorgente - presumibilmente C++

  1. #if defined __WIN32 || defined __WIN64
  2. #include <conio.h>
  3. #else
  4. char kbhit(void)
  5. {
  6.         struct termios Oldt, Newt;
  7.         char Ch;
  8.         char Oldf;
  9.  
  10.         tcgetattr(STDIN_FILENO,&Oldt);
  11.         Newt=Oldt;
  12.         Newt.c_lflag&=~(ICANON|ECHO);
  13.         tcsetattr(STDIN_FILENO,TCSANOW,&Newt);
  14.         Oldf=fcntl(STDIN_FILENO,F_GETFL,0);
  15.         fcntl(STDIN_FILENO,F_SETFL,Oldf|O_NONBLOCK);
  16.         Ch=getchar();
  17.         tcsetattr(STDIN_FILENO,TCSANOW,&Oldt);
  18.         fcntl(STDIN_FILENO,F_SETFL,Oldf);
  19.         if(Ch!=EOF)
  20.                 {
  21.                         ungetc(Ch,stdin);
  22.                         return 1;
  23.                 }
  24.         return 0;
  25. }
  26.  
  27. char getch(void)
  28. {
  29.     struct termios Oldt, Newt;
  30.     unsigned char Ch;
  31.  
  32.     tcgetattr(STDIN_FILENO,&Oldt);
  33.     Newt=Oldt;
  34.     Newt.c_lflag&=~(ICANON|ECHO);
  35.     tcsetattr(STDIN_FILENO,TCSANOW,&Newt);
  36.     Ch=getchar();
  37.     tcsetattr(STDIN_FILENO,TCSANOW,&Oldt);
  38.     return Ch;
  39. }
  40. #endif
  41. ...
  42. char Tasto;
  43. ...
  44. if(kbhit())
  45.     Tasto=getch();
  46. ...


Grazie mille però non funziona se l'applicazione è stata ridimensionata. Si, non lo avevo scritto, e ti ringrazio per la risposta mooolto veloce! :) - giulioscatto - 28/07/11 22:52
PM
Avatar
jack92 (Member)
Pro


Messaggi: 100
Iscritto: 06/08/2010

Up
0
Down
V
Segnala al moderatore
Postato alle 11:55
Venerdì, 29/07/2011
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...  

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..può funzionare, poi racchiudi le due differenti versioni (una per linux e un per win) in due direttive #ifdef e il giorco è fatto! - Alex - 29/07/11 17:57
PM
Avatar
ManfroC (Ex-Member)
Rookie


Messaggi: 26
Iscritto: 15/05/2011

Up
0
Down
V
Segnala al moderatore
Postato alle 10:07
Mercoledì, 03/08/2011
Si è vero...L'unica soluzione è quella di usare #if e #else

forse ti riferivi a #ifndef #else #endif. Meglio queste direttive del preprocessore - Pitagora - 06/08/11 22:21
si mi sono sbagliato...è l'abitudine di if e else...!!! - ManfroC - 07/08/11 13:52
PM