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

x86 32-bits / 64-bits Assembleur Discussion :

[Win32] Simuler un clic


Sujet :

x86 32-bits / 64-bits Assembleur

  1. #1
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2007
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2007
    Messages : 54
    Points : 39
    Points
    39
    Par défaut [Win32] Simuler un clic
    Bonjour à tous,

    J'aurais besoin de savoir comment simuler un clic gauche en asm 32Bits. Ne connaissant que la fonction VK_LBUTTON de GetKeyState, je ne parvient pas à faire croire au prog qu'on a cliqué, mais simplement de constater qu'a cliquer... Que dois-je donc utiliser pour simuler un clic ? Quelle fonction, et comment l'utiliser ?

    Merci

  2. #2
    Membre actif

    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 193
    Points : 277
    Points
    277
    Par défaut
    Salut,
    La souris génère des évènements renvoyant sa position sur l'écran et la position des boutons.
    souris
    Télécharger l'exemple, la suite est:
    invoke sendmessage Handlefenêtre,WM_SETCURSOR,Para1,para2
    Et on fait croire a la fenêtre que la souris se trouve à tel emplacement avec des boutons dans tel position.

  3. #3
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2007
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2007
    Messages : 54
    Points : 39
    Points
    39
    Par défaut
    J'ai commencé à lire les progs du pack movcurs qu'on peut télécharger sur le site que tu m'as filé.. C'est pas de mon niveau
    J'ai commencé l'ASM en cours y'a quelques semaines, le seul %INCLUDE qu'on connait est win32n.inc ... Oui ça fait très peu je sais, mais faut bien commencer

    Or, invoke n'est pas dans win32n.inc n'est-ce pas ?
    N'y aurait-il pas quelque part un fichier qui explique comment marche toutes les fonctions des différentes bibliothèques (avec les paramètres qu'elles attendent, ce qu'ils signifient...) histoire que je vous emmer*** pas avec mes questions incessantes ? ^^

  4. #4
    Membre confirmé
    Homme Profil pro
    .
    Inscrit en
    Juin 2002
    Messages
    239
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : .
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2002
    Messages : 239
    Points : 567
    Points
    567
    Par défaut
    Bonjour.

    Quand l'utilisateur clique avec la souris sur une zone de l'écran, le système envoie un message à la fenêtre possédant cette zone.

    Pour simuler un clic de la souris, il suffit de faire la même chose que le système, c'est-à-dire envoyer un message à une fenêtre.

    Les deux fonctions habituelles pour envoyer un message sous Win32 sont SendMessage et PostMessage.
    ( la première attend la réponse, alors que la seconde n'attend pas )

    Pour connaître la syntaxe de ces fonctions et la signification des différents paramètres, on peut consulter la MSDN Library.
    Pour SendMessage : http://msdn2.microsoft.com/en-us/library/ms644950.aspx

    Une autre possibilité est de télécharger le fichier Win32.hlp.
    Il date de Win 95, mais il contient la description de toutes les fonctions usuelles.
    Comme ce fichier est ancien, beaucoup de liens donnés par Google sont morts.
    J'en ai tout de même trouvé un de vivant :
    http://www.winasm.net/index.php?ind=...y_view&iden=23
    Le fichier ZIP fait 5.5 Mo et il se charge à une vitesse de tortue ...
    Le fichier décompressé fait 24 Mo.
    C'est une mine de renseignements pour un programmeur en Assembleur.

    Remarque : invoke n'est pas une fonction de Win32.
    C'est une macro de MASM pour un appel de procédure.

  5. #5
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2007
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2007
    Messages : 54
    Points : 39
    Points
    39
    Par défaut
    Bonjour et désolé du retard, fêtes obligent.

    Merci beaucoup pour win32.hlp, c'était bien le fichier que notre prof nous avait montré vite fait la veille des vacs sans nous le donner : il va m'être bien utile

    Quelques questions demeurent toutefois :
    Pour en revenir à ma simulation de clic, je ne suis toujours pas sûr de la fonction à utiliser. J'ai laissé tomber celles commençant par Get puisqu'apparemment elles ne font que relever l'état de quelque chose (par exemple constater que telle ou telle touche est enfoncée)
    ... ...
    Dites moi si je suis à côté de la plaque

    Donc il me faudrait une fonction qui prenne en paramètre une valeur, cette valeur étant interprétée comme étant le statut du boutton gauche de la souris (je positionnrais cette valeur de façon à ce qu'il croit que le boutton soit enfoncé pour qu'il simule le clic )
    Laquelle utliser pour cela ?

  6. #6
    Candidat au Club
    Inscrit en
    Décembre 2007
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 3
    Points : 4
    Points
    4
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    BOOL GetKeyboardState(
     
        PBYTE lpKeyState 	// address of array to receive status data
       );
    cette fonctionction écrit l'état des touche du clavier dans un tableau de 256 byte

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    invoke GetKeyboardState, addr KeyState
    keystate étant un tableau de 256 byte

    ensuite tu modifi la valeur le la touche que tu veux dans le tableau dans ton cas le bouton de gauche de la souris

    ensuite
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    BOOL SetKeyboardState(
          LPBYTE lpKeyState 	// address of array with virtual-key codes
       );
    cette fonction te permet de forcer l'état des touche du clavier et de la souris

    j'ai jamais essayé mais sé ce que j'essairais en premier. À cette adresse, tu as la liste des touches virtuelles http://www.netchain.com/api/constant...lkeycodes.html.

    voici les include que tu a besoin:

    windows.inc
    user32.inc
    user32.lib

  7. #7
    Candidat au Club
    Inscrit en
    Décembre 2007
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 3
    Points : 4
    Points
    4
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    LRESULT SendMessage(
     
        HWND hWnd,	// handle of destination window
        UINT Msg,	// message to send
        WPARAM wParam,	// first message parameter
        LPARAM lParam 	// second message parameter
       );
    cette fonction fonctionnerais bien aussi

  8. #8
    Membre actif

    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 193
    Points : 277
    Points
    277
    Par défaut
    Salut,
    Le plus simple,intercepter WM_MOUSEMOVE et on a tout ce qu'il faut sans rien demander.Voir winhelp pur une description.

  9. #9
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2007
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2007
    Messages : 54
    Points : 39
    Points
    39
    Par défaut
    Tout d'abord, merci pour vos nombreuses réponses... qui m'ont fait réfléchir pendant plus de 2h sur mon appli sans qu'elle fonctionne comme je veux..

    Je m'explique :

    J'ai commencé par essayer SetKeyboardState en lui mettant en paramètre &H01 ou &01h (code de la touche virtuelle gauche de la souris)... Ce qui provoque un plantage, avec la jolie fenêtre "monAppli.exe a rencontré un problème et doit fermer...". En enlevant le "&", l'appli tourne mais ne simule pas le clic. Quand aux INCLUDE que tu m'as donné spetfayer, mon Nasm ne les reconnaît pas (unable to open include file...).

    Je me suis alors tourné vers SendMessage qui avait l'air de répondre pile poil à ce que je voulais : Après avoir lu et relu win32.hlp et fait des recherches sur Google, je comprends pas ce qu'est le "message to send". Enfin si, je vois ce que c'est, mais je comprends pas quelle valeur lui mettre (idem pour les 2 autres paramètres). Où puis-je trouver une liste des différentes valeurs possibles pour chacun des paramètres, avec une petite ligne d'explication à chaque fois ?

    Enfin, une dernière question bête (une de + ) Les "fonctions" en majuscules (comme WM_MOUSEMOVE par exemple) ne peuvent pas être "call" apparement (WIN32 COFF doesn't support relative reference to absolute addresses), ni mises en [EXTERN WM_...] au début du prog (symbol 'WM_MOUSE' redefined).
    Donc, je me demande quelle est la différence entre les fonctions écrites en majuscules, et les autres, comme SetCursorPos ou MessageBoxA etc... ?

  10. #10
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2007
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2007
    Messages : 54
    Points : 39
    Points
    39
    Par défaut
    Désolé du double post, mais j'ai oublié de préciser que lors du link du prog, il me mets "unresolved external SendMessage" et ne me crée donc pas d'exe.. Il manque un include ? (j'include que Win32n.inc)
    Merci

  11. #11
    Membre actif

    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 193
    Points : 277
    Points
    277
    Par défaut
    Salut,
    On patauge,je vois.
    WM_MOUSEMOVE est un message windows.C'est à dire:
    Lorsqu'on crée une fenêtre,le système envoie automatiquement des messages a l'aplication pour la renseigner sur divers sujets.
    Ces messages ont une forme normalisée (avec structure,dword ...) leur permettant de passer toutes les infos nécessaires.
    Une API est un programme appelable par un call ou invoke (masm) et peut éxécuter n'importe quel tache.
    L'API sendmessage simule l'envoie d'un message par le système.

  12. #12
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2007
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2007
    Messages : 54
    Points : 39
    Points
    39
    Par défaut
    Salut,
    Wé effectivement je patauge ^^ Je viens de commencer l'assembleur et ça m'intéresse beaucoup, mais en cours ça avance pas, alors j'essaie de prendre un peu d'avance pendant les vacs... seul. Et c'est pas évident

    Merci pour l'info sur les API / Msg Windows, c'est plus clair et plus concis que tout ce que j'ai pu trouver sur le Net

    Donc l'API SendMessage doit être déclarée comme ceci : [EXTERN SendMessage] au début de l'appli, après le %INCLUDE win32n.inc n'est-ce pas ? (désolé si le vocabulaire est pas correct )
    Si jusque là j'ai pas encore faux, comment cela se fait-il que lors du link de l'appli, il refuse de me créer l'exe en m'affichant "unresolved external SendMessage" ?

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 24
    Points : 23
    Points
    23
    Par défaut Le monde est petit
    Bonjour,

    J'essaie depuis deux semaines maintenant à faire croire à mon simulateur de vol qu'il reçoit une touche. La problématique est la même que pour la souris. Je programme en C++ mais je pense que la solution à mon pb est de passer par un peu d'assembleur.

    J'ai réussi à faire envoyer des touches à un notepad en utilisant SendMessage(),
    keybd_event(), SendInput(). Mais le simu ne veut rien savoir. J'ai alors trouvé ungetch() dans conio.h, sans plus de résultat. L'idée était de mettre un caractère dans le tampon clavier en espérant qu'il soit lu par l'application.

    J'ai compris pourquoi mon simulateur ne prend rien : il utilise DirectX pour récupérer l'état des périphériques. D'autre par, j'ai vu que le clavier est programmable via le port 60h et 64h (http://sardes.inrialpes.fr/~taton/Sy...0Reference.htm). Les fonction D2 et D3 permettraient même, j'ai l'impression, de mettre un caractère sur le registre de sortie du contrôleur et de déclancher une interruption.

    Je cherche maintenant deux choses : une confirmation de mon impression , et ce qu'il faut faire car je ne connais pas du tout l'assembleur. Je pense pouvoir m'en tirer avec 4 commandes du style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    ; Appel de la fonction D2 sur le port 64h
    mov al , D2h
     
    ; Appel de fonction sur le port 64h
    out 64h, al
     
    ; 47h pour la touche G, afin de baisser les trains ....
    mov al , 47h
     
    ; Ecriture du code de la touche G sur le registre d'entrée
    ; afin qu'il soit dispo sur le registre de sortie.
    out 60h, al
    Qu'en pensez-vous ? Puis-je mettre ces 4 commandes dans une fonction de mon programme en C++ ? Comment passer un argument (code touche) à la fonction ?

    Je pense que cette solution serait transposable à la souris... (?)

    Merci et bonne année !

  14. #14
    Membre éclairé
    Avatar de edfed
    Profil pro
    être humain
    Inscrit en
    Décembre 2007
    Messages
    476
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : être humain

    Informations forums :
    Inscription : Décembre 2007
    Messages : 476
    Points : 701
    Points
    701
    Billets dans le blog
    1
    Par défaut
    evidemment, si ça fonctionne, c'est ce qu'il faut faire.
    et là, tu ne touches pas vraiment à l'asm x86, mai à l'asm du controlleur clavier, le 8042

    le meilleurmoyen de le savoir.... c'est d'essayer alors au boulot...
    et plus vite que ça . non mais , ho! hein? de quoi j'me mèle? bein je trolle en details

    voilà

  15. #15
    Membre actif

    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 193
    Points : 277
    Points
    277
    Par défaut
    Si ça ne dérange pas trop l'autre sujet, je reprends le message d'origine.
    Pour utiliser une api il faut lier la librairie contenant sa définition (sans rentrer dans les détails) au source que l'on crée.
    Par exemple pour sendmessage :
    Librairie user32.lib
    Il faut non seulement la librairie mais aussi un fichier, user32.inc déclarant les prototypes de fonctions contenus dans la librairie

    dans le source
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ;partie déclaration
    include \masm32\include\user32.inc      ;masm
    includelib \masm32\lib\user32.lib
    Et là le linker est content, plus d'erreur

  16. #16
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 24
    Points : 23
    Points
    23
    Par défaut
    Suite aux encouragements pressants de edfed j'ai essayé ce qui suit (gcc) :
    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
     
                asm  (
                    // Appel de la fonction D2 sur le port 64h
                    "movb $0xd2, %al\n\t"
     
                    // Appel de fonction sur le port 64h
                    "out %al, $0x64\n\t"
     
                    // 47h pour la touche G, afin de baisser les trains ....
                    "movb $0x47, %al\n\t"
     
                    // Ecriture du code de la touche G sur le registre d'entrée
                    // afin qu'il soit dispo sur le registre de sortie.
                    "out %al, $0x60"
                );
    Malheureusement, ça plante. Microsoft me demande ensuite si je veux envoyer un rapport d'erreur. Comme je l'ai signalé dans mon premier post, je ne connais pas le langage machine même si je comprends sa syntaxe. J'ai donc sans doute fait une erreur dans ce code.

    D'autre part, pour faire suite à ToutEnMasm, je ne voulais pas poluer ce fil mais essayer d'apporter un élément de réponse au problème initial...

    Bonsoir,
    Sylvain

  17. #17
    Membre éclairé
    Avatar de edfed
    Profil pro
    être humain
    Inscrit en
    Décembre 2007
    Messages
    476
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : être humain

    Informations forums :
    Inscription : Décembre 2007
    Messages : 476
    Points : 701
    Points
    701
    Billets dans le blog
    1
    Par défaut
    Bon, pour programmer le clavier, il faut envoyer un code au registre 64h, a condition que le flag disan que le port est libre et pret a utiliser indique bien que c'est OK.

    ensuite, ecrire le code dans le port 60h, automatiquement, le service d'interruption clavier s'enclanche et dira que oui, la touche est appuyée.
    sinon, coder son propre driver est une super bonne alternative et c'est une competence a ajouter sur le CV.

  18. #18
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 24
    Points : 23
    Points
    23
    Par défaut
    Citation Envoyé par edfed Voir le message
    Bon, pour programmer le clavier, il faut envoyer un code au registre 64h, a condition que le flag disan que le port est libre et pret a utiliser indique bien que c'est OK.

    ensuite, ecrire le code dans le port 60h, automatiquement, le service d'interruption clavier s'enclanche et dira que oui, la touche est appuyée.
    sinon, coder son propre driver est une super bonne alternative et c'est une competence a ajouter sur le CV.
    Banco... Si j'avais les bases pour ça
    Je suppose que sous Windows XP ça passe par le téléchargement de la DDK adéquate. Et ensuite, comme ça marche ? Comment être compatible avec DirectInput ?

    Comment s'autoformer à tout ça ?

    Merci,
    Sylvain

  19. #19
    Membre éclairé
    Avatar de edfed
    Profil pro
    être humain
    Inscrit en
    Décembre 2007
    Messages
    476
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : être humain

    Informations forums :
    Inscription : Décembre 2007
    Messages : 476
    Points : 701
    Points
    701
    Billets dans le blog
    1
    Par défaut
    bein, le temps petit scarabée, et de la patience a profusion.
    jetes un coup d'oeuil a mon code fournis keymap.zip

    ça marche sous dos (testé), win3.11 (non testé), win95 (non testé), win98 (testé de base en dosbox), winxp (testé en dosbox) et donc winNT, au boot depuis disquette et disque dur...
    mais pas sous vista, grrrrrrrr

    bientot (avant la fin du monde) pourra etre supporté en mode protégé.

    il faut rassembler les fichiers:
    int9.inc ; fichier principal
    keylookup.inc ; fichier include dans int9
    scancode.inc ; fichier include aussi
    dans le meme repertoire,

    et ecrire la ligne:
    include 'int9.inc'
    dans le code source.

    puis:
    call newint9

    ensuite, pour connaitre l'etat de n'importe quelle touche:
    mov al,[key+key.touche?]
    pour connaitre quelle est la touche dernièrement appuyée:
    mov al,[key+key.cur]
    pour connaitre l'etat des touches shift et compagnie:
    mov al,[key+key.flags]
    test al,key.shift?
    test al,key.alt?
    test al,key.ctrl?
    test al,key.vernum?
    attention, lire en detail le fichier scancode, c'est lui qui determine les noms des differentes touches et codes.

    voilà, ça me semble legerement plus simple que les interruptions bios et dos.
    surtout que TOUTES les TOUCHES possedent leurs propres scancodes, les codes etendus sont simplement modifiés.
    les touches du pavé numerique sont remapées.
    le programme kbint.com ne fait que lire l'etat des touches dans la table clavier, qui est automatiquement mise a jour par le service d'interruption int9

    ne pas oublier de restaurer l'ancienne interruption:
    call oldint9

    pour fasm

Discussions similaires

  1. Réponses: 11
    Dernier message: 04/01/2006, 23h57
  2. Réponses: 7
    Dernier message: 26/10/2005, 12h54
  3. Simuler un clic de souris
    Par kabikou dans le forum Access
    Réponses: 1
    Dernier message: 28/09/2005, 13h43
  4. Simulation de clic
    Par seiryujay dans le forum Agents de placement/Fenêtres
    Réponses: 7
    Dernier message: 31/08/2005, 17h05
  5. [JToggleButton] simuler un clic
    Par norkius dans le forum Composants
    Réponses: 4
    Dernier message: 30/05/2005, 16h35

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