Lettura evento tastiera

di il
5 risposte

Lettura evento tastiera

Mi consigliata una funzione simile all' getAsyncKeyState() di windows.h che però "rilevi" gli eventi solo quando la finestra del programma (console) è in primo piano?
Possibilmente da non scaricare assieme a una libreria esterna

5 Risposte

  • Re: Lettura evento tastiera

    O utilizzi la kbhit e getch della conio.h altrimenti devi ricorrere alle api e ti serviranno le seguenti api:
    GetStdHandle()
    GetConsoleMode()
    SetConsoleMode()
    GetNumberOfConsoleInputEvents()
    ReadConsoleInput()

    ma cosa devi fare?
  • Re: Lettura evento tastiera

    Volevo provare a scrivere un programma x messaggiare.
    Dato che mi interessa più il ragionamento del risultato ho optato per usare i file (al posto dei socket), che sono più semplici da manipolare e non richiedono librerie/funzioni particolari.

    Ho appena iniziato a buttar giù qualcosa e ovviamente niente funziona a dovere, ma quello che mi preme di più adesso e' trovare il modo di catturare gli eventi da tastiera senza dover "fermare" il ciclo principale.

    Il problema della GetAsyncKeyState() e' che la finestra del programma rileva la pressione di un tasto anche se e' in secondo piano (es. scrivo qualcosa sul blocco note, viene scritto anche sulla console).
    E ciò mi impedisce l'utilizzo, dato che ho solo un pc in cui far girare "client" e "server" e non posso dare un comando a uno senza che lo riceva anche l'altro.


    sorgente client:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <windows.h>
    #include <time.h>
    
    
    #define THISFILE1
    
    #ifdef THISFILE1
        #define FILE_1 "C:\\Users\\User1\\Desktop\\chatOffline\\file1"
        #define FILE_2 "C:\\Users\\User1\\Desktop\\chatOffline\\file2"
        #define TIME_AGG 1
    #else
        #define FILE_2 "C:\\Users\\User1\\Desktop\\chatOffline\\file1"
        #define FILE_1 "C:\\Users\\User1\\Desktop\\chatOffline\\file2"
        #define TIME_AGG 0
    #endif
    
    
    typedef struct __msg
    {
        char data[1024];
        int len;
    
        char mittente[50];
        char destinatario[50];
    
        struct __msg* next;
    } _msg;
    
    
    _msg* readCom()
    {
        if(time(NULL)%2!=TIME_AGG) return NULL;
    
        FILE *f;
        if((f=fopen(FILE_1,"rb"))==NULL)    return NULL;
    
        if(feof(f)) return NULL;
    
        _msg* temp=(_msg*)malloc(sizeof(_msg));
        _msg* msg_head=NULL;
        _msg* head=NULL;
    
        if(fread(temp,sizeof(_msg),1,f)){
            msg_head=temp;
            head=msg_head;
        }
        else{
            free(temp);
            return NULL;
        }
    
        temp=(_msg*)malloc(sizeof(_msg));
    
        while((fread(temp,sizeof(_msg),1,f))){
            temp->next=NULL;
            msg_head->next=temp;
            msg_head=msg_head->next;
    
            temp=(_msg*)malloc(sizeof(_msg));
        }
    
        msg_head->next=NULL;
        free(temp);
    
        remove(FILE_1);
    
        return head;
    }
    
    int writeCom(_msg* msg)
    {
        while(time(NULL)%2 == (TIME_AGG+1)%2)    Sleep(50);
        while(time(NULL)%2 == TIME_AGG)    Sleep(50);
    
        FILE *f;
        f=fopen(FILE_2,"w+b");
    
        while(msg!=NULL){
            fwrite(msg,sizeof(_msg),1,f);
            msg=msg->next;
        }
    
        fclose(f);
    
        return 0;
    }
    
    void myprint(char* buf,int len)
    {
        int i;
    
        for(i=0;i<len;i++){
            printf("%c", buf[i]);
        }
    
        return;
    }
    
    int printMsg(_msg* msg)
    {
        printf("\n messaggi in arrivo:\n");
    
        while(msg!=NULL){
            printf("Mittente: %s", msg->mittente);
            printf("\nDestinatario: %s", msg->destinatario);
            printf("\nMessaggio: ");
            myprint(msg->data,msg->len);
            printf("//////////////////////////////////\n");
    
            msg=msg->next;
        }
    
        printf("\n fine messaggi in arrivo\n");
    
        return 0;
    }
    
    bool mygetchar(char *buf, int &indice)
    {
        int i;
        bool isKey=0;
        bool isMaiusc=0;
    
        if(GetAsyncKeyState(VK_SHIFT)){
            isMaiusc=1;
        }
    
        for(i=0x30;i<0x5b;i++){
            if(GetAsyncKeyState(i)){
                if(isMaiusc)
                    buf[indice]=i;
                else
                    buf[indice]=i-'A'+'a';
    
                indice++;
                isKey=1;
            }
        }
    
        if(GetAsyncKeyState(VK_BACK)){
            indice--;
            isKey=1;
        }
    
        if(GetAsyncKeyState(VK_SPACE)){
            buf[indice]=' ';
            indice++;
            isKey=1;
        }
    
        if(GetAsyncKeyState(VK_RETURN)){
            buf[indice]='\n';
            indice++;
            isKey=1;
        }
    
    
        if(isKey){
            system("cls");
            myprint(buf,indice);
        }
    }
    
    
    
    int main()
    {
        char *buf=new char[500];
        _msg* msgWrite=new _msg;
        _msg* msgRead=NULL;
        int i;
    
        for(i=0;i<0xdf;i++)
            GetAsyncKeyState(i);
    
        int indice=0;
    
        while(1){
            mygetchar(buf,indice);
    
            if(GetAsyncKeyState(VK_TAB)){
                strcpy(msgWrite->data,buf);
                msgWrite->len=indice;
                strcpy(msgWrite->mittente,"Ale\0");
                strcpy(msgWrite->destinatario,"Ehm...\0");
                msgWrite->next=NULL;
                writeCom(msgWrite);
    
                system("cls");
                printf("\n Stringa inserita: ");
                myprint(buf,indice);
                indice=0;
            }
    
            if((msgRead=readCom())!=NULL){
                printf("\n\n");
                printMsg(msgRead);
                system("pause");
            }
    
            Sleep(130);
        }
    
        return 0;
    }
    
  • Re: Lettura evento tastiera

    Bhè perchè non usi la kbhit+getch?
  • Re: Lettura evento tastiera

    Perchè fino al tuo precedente messaggio non sapevo dell'esistenza della kbhit()...

    Domani provo e ti dico Ciao
  • Re: Lettura evento tastiera

    https://www.iprogrammatori.it/forum-programmazione/cplusplus/come-implementare-premi-tasto-lampeggiante-t19592.html#p8509450
Devi accedere o registrarti per scrivere nel forum
5 risposte