IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage C++ Discussion :

[Linux] simuler au système pression sur touches du clavier


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Inscrit en
    Mars 2010
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 10
    Par défaut [Linux] simuler au système pression sur touches du clavier
    Bonjour,
    je suis sur un projet pour simuler l'appuis sur les flèches directionnelles selon la variation de position du volant.
    Je suis sous Archlinux.
    Je joue à FS19, mais le jeu ne reconnait pas le volant.
    Qjoypad ne donne pas bon résultat car il ne dose pas l'appui sur les touches selon la variation du volant
    J'ai donc commencé à coder en C++ avec SDL un petit soft qui récupère la position du volant, calcule la variation du volant entre 2 temps pour définir s'il faut braquer à droite ou à gauche et de combien.
    Cette partie fonctionne très bien, maintenant ma question est comment je dis qu'il faut simuler au système que j'ai appuyé une, 2.3... fois sur la flèche droite ou gauche.

    J'ai trouvé des sujets avec key_event mais il dépend de la librairie windows.h qui est windows ? je me trompe?
    quelle librairie et quelle fonction je peux utiliser?
    J'ai regardé dans SDL mais je n'ai pas trouvé.

    Nom : 1554739499.png
Affichages : 801
Taille : 198,9 Ko

    Mon projet :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    #include "SDL2/SDL.h"
    #include <iostream>
    #include <string>
    #include <unistd.h>
     
     
     
    int main(int argc , char *argv[])
        {
        //initialisation de sdl
        SDL_Init(SDL_INIT_JOYSTICK);
    	std::cout << "initilisation volant" << SDL_Init(SDL_INIT_JOYSTICK) << std:: endl;
     
        //verification du volant
    	SDL_Joystick *joy;
    	if (SDL_NumJoysticks() > 0) 
    		{
        	// Open joystick
        	joy = SDL_JoystickOpen(0);
     
        	if (joy) 
        		{
            	printf("Opened Joystick 0\n");
           		printf("Name: %s\n", SDL_JoystickNameForIndex(0));
            	printf("Number of Axes: %d\n", SDL_JoystickNumAxes(joy));
            	printf("Number of Buttons: %d\n", SDL_JoystickNumButtons(joy));
            	printf("Number of Balls: %d\n", SDL_JoystickNumBalls(joy));
        		}
        	else {
            	printf("Couldn't open Joystick 0\n");
        		}
        	}
        else {
        	printf("pas de volant");
        	}
     
        //position du volant
    	Sint16 x;
        Sint16 SDL_JoystickGetAxis(SDL_Joystick* joystick, int axis);
        int X;
        int Xold;
        int DeltaX;
        X=0;
        Xold = 0;
    	std::cout  << "centrez votre volant avant de renter dans un vehicule" << std::endl;
     
        int Temps;
        Temps = 25;
     
        while (Temps>0)
        {
        	Temps = Temps-1;
        	Xold=X;
        	SDL_JoystickClose(joy);
        	joy = SDL_JoystickOpen(0);
        	x = SDL_JoystickGetAxis(joy, 0);
        	if (x>3000)
        	{
        		if (x>30000)
        		{
        		X=10;
        		}
        		else if (x>27000)
        		{
        		X=9;
        		}
        		else if (x>24000)
        		{
        		X=8;
        		}
        		else if (x>21000)
        		{
        		X=7;
        		}
        		else if (x>18000)
        		{
        		X=6;
        		}
        		else if (x>15000)
        		{
        		X=5;
        		}
        		else if (x>12000)
        		{
        		X=4;
        		}
        		else if (x>9000)
        		{
        		X=3;
        		}
        		else if (x>6000)
        		{
        		X=2;
        		}
        		else
        		{
        		// de 3000 à 6000
        		X=1;
        		}
        	}
        	else if (x<-3000)
        		{
        		if (x<-30000)
        		{
        		X=-10;
        		}
        		else if (x<-27000)
        		{
        		X=-9;
        		}
        		else if (x<-24000)
        		{
        		X=-8;
        		}
        		else if (x<-21000)
        		{
        		X=-7;
        		}
        		else if (x<-18000)
        		{
        		X=-6;
        		}
        		else if (x<-15000)
        		{
        		X=-5;
        		}
        		else if (x<-12000)
        		{
        		X=-4;
        		}
        		else if (x<-9000)
        		{
        		X=-3;
        		}
        		else if (x<-6000)
        		{
        		X=-2;
        		}
        		else
        		{
        		// de -6000 à -3000
        		X=-1;
        		}
        	}
        	else{
        		// de -3000 à +3000
        		X=0;
        	}
        	DeltaX=X-Xold;
        	if (DeltaX>0)
        	{
        		std::cout  <<"Position:  "<< X << "  Braquer vers droite de : "  << DeltaX << std::endl;
        	}
        	else if (DeltaX<0)
        	{
        		std::cout  <<"Position:  "<< X << "  Braquer vers gauche de : "  << DeltaX << std::endl;
        	}
        	else
        	{
        		std::cout  <<"Position:  "<< X << "  garder la position , ne pas braquer : "  << DeltaX << std::endl;
        	}
    		sleep(2);
    	}
        SDL_JoystickClose(joy);
    	return 0;
    }
    Merci de votre aide future

  2. #2
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2011
    Messages
    760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 760
    Par défaut
    Pour la simulation de touche, tu peux regarder comment fonctionne d'autres programmes comme antimicro (simulation de clavier/souris à travers une manette). Peut-être fait-il aussi les volants ?

    Je ne pense pas qu'il existe de bibliothèque générique pour ça, il faudra taper directement dans le gestionnaire d'input/serveur d'affichage. Sur Linux il y en a principalement 2: Xorg et Wayland. Wayland est l'avenir, mais il faut que la distribution le supporte (ce qui est normalement le cas (ou en cours) pour toutes(?) les distributions). Au pire, il y a un serveur de compatibilité X pour Wayland, qui permet normalement d'avoir une application X fonctionnelle en Wayland.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 118
    Par défaut
    L'outil en ligne de commande XDOTool, qui permet de simuler souris et clavier et d’interagir avec les fenêtres, propose aussi une bibliothèque C qui est plutôt pas mal (LibXDO). Après, il en existe d'autres mais je ne connais plus les noms.
    Par contre attention, ils fonctionnent sous XOrg, pas sous Wayland. Ce dernier est complètement verrouillé (pour sa "sécurité") et ce genre d'outils ne pourront jamais fonctionner sous ce serveur graphique.
    Rien que coder un outil de capture d'écran multi-plateforme (ou en tout cas, qui fonctionnerait avec n'importe quel gestionnaire de fenêtre) est parait-il quasi mission impossible.
    Wayland représente peut-être l'avenir, mais il n'est pas prêt de s'imposer.

Discussions similaires

  1. [Python 3.X] Détecter la pression de touches du clavier SANS interface graphique.
    Par AlexMazAlex dans le forum Programmation multimédia/Jeux
    Réponses: 0
    Dernier message: 17/06/2015, 14h19
  2. Simuler la souris avec les touches du clavier
    Par Jérôme5 dans le forum Visual C++
    Réponses: 2
    Dernier message: 20/04/2009, 11h32
  3. Réponses: 0
    Dernier message: 21/01/2009, 00h16
  4. Simuler une pression sur la touche PrintScreen
    Par Furius dans le forum Windows
    Réponses: 4
    Dernier message: 05/01/2006, 13h26
  5. Simuler un e pression sur une touche du clavier
    Par Furius dans le forum VBScript
    Réponses: 13
    Dernier message: 11/12/2005, 17h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo