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

Windows Discussion :

Impossibilité de simuler une entree clavier


Sujet :

Windows

  1. #1
    Membre confirmé
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2006
    Messages
    400
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 400
    Points : 459
    Points
    459
    Par défaut Impossibilité de simuler une entree clavier
    Bonjour,

    J'essai actuellement de développer un module pour le jeu "Neverwinter Nights". Lors des tests, j'aurais besoin de simuler une entrée clavier. Donc en me basant sur le tutorial dédié au controle clavier/souris sous windows, j'ai fait un petit programme, malheureusement impossible de le faire fonctionner comme je veux. je l'ai testé sur windows média et sur un editeur de texte sa marche. En revanche sur le jeu rien du tout, sauf lorsque j'utilise la fenetre de dialogue du jeu, ma "frappe simulée" apparée donc l'entrée arrive bien au jeu, mais danc le cas d'une interaction déclenchée par ma touche correspondant à une macro aucun résultat.
    Voilà la partie du code "intéressante":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    
    Appli = GetForegroundWindow();           //selection de l'application
    
     keybd_event('1',0,0,0);
     SendMessage(Appli,WM_CHAR,'1',0);      //simulation de la touche '1'
    Voilà, en espérant avoir été assez clair, et en vous remerciant d'avance pour vos réponses.
    A bientôt.
    "Ce n'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont forcément raison" (Bernard Weber "Le mystere des dieux")

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Envoyer une touche à une fenêtre ne marche pas avec WM_CHAR (j'ai déjà testé en m'aidant de spy++).

    Par contre, ça marche partiellement avec WM_KEYDOWN et WM_KEYUP.
    Je dis partiellement, car par exemple, les touches comme MAJ n'ont pas d'influence (MAJv Av A^ MAJ^ tapera un 'a' minuscule comme si MAJ j'avait pas été pressé.)

    PS: Est-ce que NWN accepte des entrées du système d'exploitation, pour commencer? Un programme base sur GetAsyncKeyState() par exemple (ou GetKeyState() aussi, en fait) sera insensible à ces messages.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre confirmé
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2006
    Messages
    400
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 400
    Points : 459
    Points
    459
    Par défaut
    Bien, en fait, je me suis dit que NWN accepté le message venant de l'OS puisque le caractère "simulé" apparait dans la barre de dialogue du jeu, sinon puis je savoir si NWN ets de type GetAsyncKeyState() ou GetKeyState()?
    "Ce n'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont forcément raison" (Bernard Weber "Le mystere des dieux")

  4. #4
    Membre confirmé
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2006
    Messages
    400
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 400
    Points : 459
    Points
    459
    Par défaut
    Bonsoir,
    j'ai testé avec les fonctions WM_KEYDOWN et WM_KEYUP et là je n'ai plus aucun résultat quelque soit l'application (windows media, notepad, firefox). Je ne comprend pas tres bien le rôle de ces fonctions et leur differences avec keyd_event et WM_CHAR. Sinon j'ai testé avec d'autre jeux, le résultat est le même aucun changement quand à l'interaction du jeu et affichage du charactere "simulé" dans la fenetre de dialogue du jeu donc le probleme est étendu à tous les jeux.
    A bientôt
    "Ce n'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont forcément raison" (Bernard Weber "Le mystere des dieux")

  5. #5
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Il me semble que pour simuler l'envoi de touche il faut utiliser SendInput :
    Citation Envoyé par MSDN
    The SendInput function synthesizes keystrokes, mouse motions, and button clicks.

    UINT SendInput(
    UINT nInputs, // count of input events
    LPINPUT pInputs, // array of input events
    int cbSize // size of structure
    );
    Parameters
    nInputs
    [in] Specifies the number of structures in the pInputs array.
    pInputs
    [in] Pointer to an array of INPUT structures. Each structure represents an event to be inserted into the keyboard or mouse input stream.
    cbSize
    [in] Specifies the size, in bytes, of an INPUT structure. If cbSize is not the size of an INPUT structure, the function will fail.
    Return Values
    The function returns the number of events that it successfully inserted into the keyboard or mouse input stream. If the function returns zero, the input was already blocked by another thread.

    To get extended error information, call GetLastError.

    Remarks
    The SendInput function inserts the events in the INPUT structures serially into the keyboard or mouse input stream. These events aren't interspersed with other keyboard or mouse input events inserted either by the user (with the keyboard or mouse) or by calls to keybd_event, mouse_event, or other calls to SendInput.

    This function does not reset the keyboard's current state. Any keys that are already pressed when the function is called might interfere with the events that this function generates. To avoid this problem, check the keyboard's state with the GetAsyncKeyState function and correct as necessary.

    Requirements
    Windows NT/2000 or later: Requires Windows NT 4.0 SP3 or later.
    Windows 95/98/Me: Requires Windows 98 or later.
    Header: Declared in Winuser.h; include Windows.h.
    Library: Use User32.lib.
    En tout cas, rien à voir avec le C, c'est du "Développement Windows"
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  6. #6
    Membre confirmé
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2006
    Messages
    400
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 400
    Points : 459
    Points
    459
    Par défaut
    Bonjour,

    Merci Trap pour ton info, j'ai jeté un coup d'oeil au développement windows mais alors la je vois pas du tout comment commencer, si quelqu'un a une petite piste je suis preneur.
    A bientot
    "Ce n'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont forcément raison" (Bernard Weber "Le mystere des dieux")

  7. #7
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Salut
    Chez moi ça fonctionne
    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
    	CWnd  *hwnd = FindWindow(NULL, "Calculatrice");
    	if (hwnd == NULL)
    		AfxMessageBox("Rate", MB_OK);
    
    	hwnd->SetForegroundWindow();
    	hwnd->SetFocus();
    	INPUT tinput[4] ;
    	memset(&tinput, 0, sizeof(tinput));
    	tinput[0].type = INPUT_KEYBOARD;
    	tinput[0].ki.time = 0;
    	tinput[0].ki.wVk = VK_DELETE;
    	tinput[0].ki.dwFlags = KEYEVENTF_KEYUP;
    	tinput[1].type = INPUT_KEYBOARD;
    	tinput[1].ki.time = 0;
    	tinput[1].ki.wVk = VK_DELETE;
    	tinput[2].type = INPUT_KEYBOARD;
    	tinput[2].ki.time = 0;
    	tinput[2].ki.wVk = VK_NUMPAD1;
    	tinput[2].ki.dwFlags = KEYEVENTF_KEYUP;
    	tinput[3].type = INPUT_KEYBOARD;
    	tinput[3].ki.time = 0;
    	tinput[3].ki.wVk = VK_NUMPAD1;
    	SendInput(4, tinput, sizeof(INPUT));
    Ça efface ce qui est affiché sur la calculette et ça affiche 1.
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  8. #8
    Membre confirmé
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2006
    Messages
    400
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 400
    Points : 459
    Points
    459
    Par défaut
    Bonjour,

    Merci Trap pour cette portion de code, seulement je voudrai savoir quest ce que le "CWND" et le pointeur sur la fenêtre et ensuite quels sont tes includes parceque le type INPUT je ne trouve pas.

    Merci d'avance

    A bientot
    "Ce n'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont forcément raison" (Bernard Weber "Le mystere des dieux")

  9. #9
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    C'est du MFC: CWnd est la classe MFC qui gère une fenêtre.
    Heureusement pour la conversion, la plupart des fonctions CWnd::UneFonction() possèdent généralement un équivalent UneFonction(HWND, ...)
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  10. #10
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Salut
    c'est du MFC.
    J'avais pas vu la réponse de Médinoc
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  11. #11
    Membre confirmé
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2006
    Messages
    400
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 400
    Points : 459
    Points
    459
    Par défaut
    Tout dabord merci pour vos réponses si rapides.
    Par contre j'avoue que je sèche sur MFC. J'ai parcouru un peu les tutoriaux, voilà les questions que je me pose:
    Me faut-il absolument visualC++ pour utiliser le code donné par Trap?
    Apparement le MFC concerne des fenêtres Windows avec toutes options dans mon cas je me contenterai bien d'un shell DOS, est ce possible?
    Et enfin comment donc utilisé le précieux code fourni par Trap?
    Je suis désolé de m'écarter autant du sujet initial mais ne connaissant absolument rien du MFC, je ne puis faire autrement.

    A bientot
    "Ce n'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont forcément raison" (Bernard Weber "Le mystere des dieux")

  12. #12
    Membre éprouvé

    Profil pro
    Inscrit en
    Août 2003
    Messages
    878
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 878
    Points : 1 067
    Points
    1 067
    Par défaut
    Citation Envoyé par mafyoso
    Tout dabord merci pour vos réponses si rapides.
    Par contre j'avoue que je sèche sur MFC. J'ai parcouru un peu les tutoriaux, voilà les questions que je me pose:
    Me faut-il absolument visualC++ pour utiliser le code donné par Trap?
    Apparement le MFC concerne des fenêtres Windows avec toutes options dans mon cas je me contenterai bien d'un shell DOS, est ce possible?
    Et enfin comment donc utilisé le précieux code fourni par Trap?
    Je suis désolé de m'écarter autant du sujet initial mais ne connaissant absolument rien du MFC, je ne puis faire autrement.

    A bientot
    Bonjour,

    Regarde la description de SendInput dans MSDN.
    Tu vois "MFC" écrit quelque-part ?
    Non ?
    Alors tu as ta réponse.

    Si tu veux que ton appli. fonctionne aussi sous Win95, alors jette aussi un oeil à keybd_event.

    Enfin, une simple recherche sur concernant SendInput et DirectX renvoie entre autres ce lien : http://forums.microsoft.com/MSDN/Sho...25257&SiteID=1.

    Bon courage.
    Un problème bien exposé
    est, pour moitié, solutionné. / La connaissance s'accroît quand on la partage, pas quand on l'impose. / La violence est le langage des faibles.

  13. #13
    Membre confirmé
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2006
    Messages
    400
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 400
    Points : 459
    Points
    459
    Par défaut
    Merci pour cet éclaircissement.
    Malheuresement j'ai encore un probleme, IMPUT n'est pas reconnu comme un type dans mon programme, j'ai bien mit en include windows.h . J'ai regarder les caracteristiques de ce type sur msdn sa ne m'a pas renseigné. Merci quand même
    A bientôt
    "Ce n'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont forcément raison" (Bernard Weber "Le mystere des dieux")

  14. #14
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Using the Windows Headers
    Si SendInput nécessite Win98 ou supérieur, il y a des chances pour que ton problème soit là.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  15. #15
    Membre confirmé
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2006
    Messages
    400
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 400
    Points : 459
    Points
    459
    Par défaut
    Bonjour,

    J'ai XP pro SP2 comme OS, donc sa devrai aller. Par contre je me demande si ce ne serait pas mes sources windows qui sont "périmées", apparement on peut les mettre à jour. Sinon par curiosité, qu'utilisez vous comme logiciel de dvp, moi j'utilise DEVC++ étant donné que les sources windows sont fournies avec peut etre que ça vient de là.

    Je vais essayer de trouver un version d'essai de Visual C++ pour voir.

    A bientot
    "Ce n'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont forcément raison" (Bernard Weber "Le mystere des dieux")

  16. #16
    Membre confirmé
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2006
    Messages
    400
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 400
    Points : 459
    Points
    459
    Par défaut
    Bonjour,

    Voilà quatre jours que je cherche sans résultats, mon problème reste le même: mon compilateur ne reconnait ni le type "INPUT" ni "CWnd", j'ai vérifié dans les includes la présence de ses fonctions, "INPUT" apparaît bien dans winuser.h rappelé ensuite par windows.h. Je désespere, j'ai essayé visual c++ express 2005 seulement il ne contient pas la librairie d'include windows. Alors peut etre que je me fourvoie dans un raisonnement qui n'est pas le bon mais vraiment je ne vois pas.

    A bientot.
    "Ce n'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont forcément raison" (Bernard Weber "Le mystere des dieux")

  17. #17
    Membre confirmé
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2006
    Messages
    400
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 400
    Points : 459
    Points
    459
    Par défaut
    Bonsoir,

    Voila 10 jours que j'essaye de faire fonctionner le code de Trap, pas moyen. J'ai essayé avec visual c++ 6, en créant une application dos avec mfc, je rencontre toujours les même problèmes c'est à dire "type INPUT undefined" et "cannot convert from 'struct HWND__ *' to 'class CWnd *' ". Je ne vois vraiment pas, si quelqu'un peut m'espliquer...

    Bonne soirée
    "Ce n'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont forcément raison" (Bernard Weber "Le mystere des dieux")

  18. #18
    Membre confirmé
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2006
    Messages
    400
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 400
    Points : 459
    Points
    459
    Par défaut
    Bonjour,

    J'ai trouvé la solution il y a quelques temps déjà, je suis enfin arrivé a faire fonctionner le code de Trap malheureusement sa ne fonctionnait toujours pas pour les jeux. Aprés quelques recherches j'ai apprit que les jeux plus ou moins "online", "récupérent" leurs entrées clavier/souris à un niveau inférieur par rapport au niveau du système d'exploitation, ceci pour éviter la triche. Je n'ai pas de grandes connaissances en architecture système mais cette explication me convient. J'ai donc abandonné mon projet, néanmoins siquelqu'un recherche un simulateur fonctionnant pour les jeux, je conseille macroMagic disponible en version d'essai.

    Problème résolu

    A bientôt
    "Ce n'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont forcément raison" (Bernard Weber "Le mystere des dieux")

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Simuler une touche clavier
    Par jblecanard dans le forum C++
    Réponses: 2
    Dernier message: 20/12/2010, 14h33
  2. Simuler une touche clavier
    Par SPACHFR dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 08/12/2010, 20h02
  3. Shell, lire une entrée clavier
    Par manuaccess10 dans le forum Linux
    Réponses: 8
    Dernier message: 01/06/2006, 22h01
  4. Simuler une touche clavier
    Par micky13 dans le forum Langage
    Réponses: 9
    Dernier message: 17/04/2006, 20h08
  5. [Applet]simuler une touche clavier
    Par mat10000 dans le forum Interfaces Graphiques en Java
    Réponses: 19
    Dernier message: 12/12/2003, 16h23

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