Simulare la pressione di un tasto con Arduino e C++

di il
8 risposte

Simulare la pressione di un tasto con Arduino e C++

Salve!
Ho scoperto da poco che un mio amico ha perso l'utilizzo di alcuni muscoli della mano/braccio a seguito di un nervo danneggiato. Ho deciso quindi di fare un joypad personalizzato per lui, (non può più usare una tastiera) come regalo. Il joypad è davvero base, ha solo 4+ pulsanti e un arduino. Lato PC, userò il c++, so leggere il serial USB, ma mi manca la cosa più importante: "simulare" la pressione di un tasto della tastiera con un software.
Premetto che ero davvero indeciso in quale sezione mettere questo post, perché comprende c++, arduino ma soprattutto le api di Windows.
Ho utilizzato le API di windows con SendInput, niente di più facile, peccato che hanno funzionato ovunque tranne che nel videogame (sto facendo test su League of Legends). Ho provato anche ad usare il vecchio keybd_event, ormai deprecated, ma non ha funzionato nemmeno quello. Facendo qualche ricerca, ho trovato un messaggio su un thread di StackOverflow (thread: https://arduino.stackexchange.com/questions/26700/can-i-make-so-when-i-press-a-button-on-my-arduino-uno-board-it-will-press-a-key) dove diceva:
[...]That said, you can have problems sending spoofed events to video games that don't use standard Windows forms.
Questo vuol dire che per far funzionare il joypad in alcuni giochi non posso usare le API di Windows...
Attualmente sto cercando soluzioni su Internet, ma non riesco a trovare nulla, a parte le API di Windows...
Qualcuno avrebbe soluzioni? Grazie mille in anticipo
(alla fine ho messo C++ perché è un problema non legato all'OS.. credo. Se non ho fatto bene, vi prego di spostare il msg nella sezione corretta. )

8 Risposte

  • Re: Simulare la pressione di un tasto con Arduino e C++

    Intento nobile, ma onestamente non si riesce a capire cosa tu voglia fare. Prova a spiegare per bene qual è l'obiettivo finale, senza linguaggi di mezzo.
  • Re: Simulare la pressione di un tasto con Arduino e C++

    Mi serve "premere un tasto" da un software, o meglio, simulare il suo click. Ad esempio, ogni 3 secondi il programma "preme" il tasto "Q".
    L'ho già fatto come test, utilizzando SendInput(), funzione della libreria windows.h e simulando la pressione del tasto ogni 3 secondi.
    Questo però deve funzionare ovunque, quindi le API di Windows non vanno bene. (funzionano, ad esempio, nel block notes, su firefox e si possono anche fare gli shortcuts, ma non funziona in alcuni videogames: il gioco non reagisce minimamente all'input ricevuto, come se il programma fosse chiuso. Vedi il post che ho messo sopra per la ragione per cui ciò accade)
    Che altri modi ci sono per farlo? So per certo che ci sono perché è pieno di bot per quei videogames, software che giocano automaticamente ai giochi, e che usano le abilità senza nessun input da device fisico...

    Tutto il resto che ho scritto nel post è solo backstory, ma in sè non è necessario alla risoluzione del problema. Non ho problemi con Arduino o altre parti del software, il mio unico problema è "premere un tasto" con il programma in C++.
  • Re: Simulare la pressione di un tasto con Arduino e C++

    Ok, quindi il problema è esattamente l'interfaccia col videogioco e Arduino non c'entra nulla. Hai provato a contattare gli autori del videogioco spiegandogli il tuo intento?
  • Re: Simulare la pressione di un tasto con Arduino e C++

    Una soluzione potrebbe essere quella di sviluppare un device driver a livello kernel per il tuo dispositivo.

    E probabilmente il gioco utilizza directinput o qualcosa ancora a più basso livello (quindi con poche probabilità di interagire). I Bot molte volte agiscono sui valori in memoria conosciuti del gioco che modificano il comportamento non direttamente dell'input.

    Prova a interagire con il tuo amico con altri giochi altrettanto divertenti.
  • Re: Simulare la pressione di un tasto con Arduino e C++

    Se vuoi lavorare invece lato arduino puoi simulare una tastiera PS/2, o con altro hardware una USB
  • Re: Simulare la pressione di un tasto con Arduino e C++

    Weierstrass ha scritto:


    Ok, quindi il problema è esattamente l'interfaccia col videogioco e Arduino non c'entra nulla. Hai provato a contattare gli autori del videogioco spiegandogli il tuo intento?
    Mmmmh...
    Diciamo che il gioco in cui sto testando l'app ha da anni il numero più alto di giocatori connessi simultaneamente al mondo, non mi sorprende che nella sezione supporto non ci sia niente che riguarda questo argomento... Non credo riceverò mai supporto da loro. Posso provare massimo a chiedere nel forum...

    oregon ha scritto:


    Una soluzione potrebbe essere quella di sviluppare un device driver a livello kernel per il tuo dispositivo.

    E probabilmente il gioco utilizza directinput o qualcosa ancora a più basso livello (quindi con poche probabilità di interagire). I Bot molte volte agiscono sui valori in memoria conosciuti del gioco che modificano il comportamento non direttamente dell'input.

    Prova a interagire con il tuo amico con altri giochi altrettanto divertenti.

    Dall'ultima frase suppongo che ciò che hai esposto sia molto difficile da fare... Meh, faccio comunque una ricerca per capire se posso fare qualcosa (o copiare brutalmente codice da qualche parte), non perdo la speranza così facilmente

    StandardOil ha scritto:


    Se vuoi lavorare invece lato arduino puoi simulare una tastiera PS/2, o con altro hardware una USB
    Non posso, la simulazione della tastiera (ad esempio con la libreria Keyboard) non è possibile con gli arduino che ho io (serve un arduino due, leonardo o yum se non sbaglio... Io ho 3 arduino uno e 2 nano).
  • Re: Simulare la pressione di un tasto con Arduino e C++

    E beh compratelo il due, no? Sono solo 40 euro, lo fai per una giusta causa e poi impari a programmare gli ARM... che vuoi di più?
  • Re: Simulare la pressione di un tasto con Arduino e C++

    Io concorquoto, ovvero siccome concordo allora quoto
    Comunque tastiere PS/2 si simulano con la UNO
    A volersi sbattere anche USB, ma saremmo al limite
Devi accedere o registrarti per scrivere nel forum
8 risposte