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

Python Discussion :

Simuler entrée clavier


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Etudiant en maths sup
    Inscrit en
    Novembre 2011
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Etudiant en maths sup

    Informations forums :
    Inscription : Novembre 2011
    Messages : 31
    Par défaut Simuler entrée clavier
    Bonjour!

    Voilà je débutes en Python qui est mon premier langage, et je souhaite faire un bot.
    Dans une étape du bot, celui-ci doit se connecter sur une page, donc entrer un username et un password, et j'aimerais savoir comment simuler une entrée clavier, avec comme paramètre la chaîne à entrer, et que celle-ci soit sensible à la casse et aux caractères spéciaux.

    Car j'ai bel et bien cherché au préalable, j'ai réussi à faire ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    def str_input(string):
        for i in string:
            caractere = win32api.VkKeyScan(i)
            win32api.keybd_event(caractere,0)
            time.sleep(0.05)
    Hélas VkKeyScan n'est pas sensible à la casse, et on ne peut envoyer i directement à keybd_event car celui ci attend un int.
    En fait ce n'est même pas qu'elle n'est pas sensible à la casse, c'est qu'elle gère chaque touche du clavier, indépendamment de SHIFT, donc si on entre "?" on récupère "," si on entre "A" on récupère "a".. Et je n'ai également aucun chiffre.. le "1" donne "&", le "2" donne "é", etc..
    Et sinon, quels sont les paramètres qu'on peut entrer à ces deux fonctions? Et ce 0 en paramètre à keybd_event? (Il n'y a pas de docstring sur ces fonctions..)

    De plus quand on entre plusieurs fois la même lettre, keybd_event n'en affiche qu'une, j'ai trouvé comment régler ça à l'aide d'un time.sleep(0.05), mais je trouve ça pas propre, y a-t-il un moyen d'entrer tout d'un coup, avec les mêmes caractères à la suite?

    Merci d'avance pour votre aide!

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 696
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 696
    Par défaut
    Salut,
    Jetez un oeil à la discussion
    Cordialement,
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre averti
    Homme Profil pro
    Etudiant en maths sup
    Inscrit en
    Novembre 2011
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Etudiant en maths sup

    Informations forums :
    Inscription : Novembre 2011
    Messages : 31
    Par défaut
    J'ai absolument rien compris au post vers lequel tu m'as dirigé, mais j'ai de tout de façon trouvé tout seul, sans n'avoir aucun module à rajouter.

    Merci quand même!

  4. #4
    Membre expérimenté
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    250
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 250
    Par défaut
    Citation Envoyé par Knightdead Voir le message
    J'ai absolument rien compris au post vers lequel tu m'as dirigé, mais j'ai de tout de façon trouvé tout seul, sans n'avoir aucun module à rajouter.

    Merci quand même!
    Ta solution m'intéresse car j'ai le même problème et je n'ai pas encore trouvé comment le résoudre.

    Merci d'avance.

  5. #5
    Membre averti
    Homme Profil pro
    Etudiant en maths sup
    Inscrit en
    Novembre 2011
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Etudiant en maths sup

    Informations forums :
    Inscription : Novembre 2011
    Messages : 31
    Par défaut
    Citation Envoyé par _vince_ Voir le message
    Ta solution m'intéresse car j'ai le même problème et je n'ai pas encore trouvé comment le résoudre.
    J'ai créé 2 fonctions comme ceux-ci:

    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
    def std(string):
        for i in string:
            caractere = win32api.VkKeyScan(i)
            if caractere >= 304:
                maj(caractere)
            else:
                win32api.keybd_event(caractere,0)
            time.sleep(.05)
     
    def maj(char):
            win32api.keybd_event(win32con.VK_SHIFT, 0, 0, 0)
            win32api.keybd_event(char, 0, win32con.KEYEVENTF_EXTENDEDKEY | 0, 0) 
            time.sleep(0.05)
            win32api.keybd_event(char, 0, win32con.KEYEVENTF_EXTENDEDKEY | win32con.KEYEVENTF_KEYUP, 0)
            time.sleep(0.05)
            win32api.keybd_event(win32con.VK_SHIFT, 0, win32con.KEYEVENTF_KEYUP, 0)
    Pour mettre en majuscules j'ai trouvé sur un autre site, par contre j'ai eu quelques bugs (des touches qui ne marchaient plus après avoir utilisé la fonction, jusqu'à ce que je la réutilise) alors si tu en as aussi renseigne toi sur keybd_event pour corriger ça.
    Ensuite je ne sais pas si c'est universel mais j'ai remarqué que les caractères utilisant la majuscule retournent un code supérieur à 304, c'est un peu de la bidouille mais ça marche pour moi.

    Bonne soirée.

  6. #6
    Membre expérimenté
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    250
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 250
    Par défaut
    Pour info, je me suis inspiré d'un bout de code sur internet :
    http://noabsolutetruths.com/2010/05/...-in-eventghost

    J'ai modifié le code pour les chiffres de 0 à 9. Pour les lettres, chiffres et quelques signes de ponctuation, ça fonctionne. Mais pour le - ? (par exemple), ça ne fonctionne pas comme prévu.

    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
     
    import win32api, win32con, time, sys
     
    KEYEVENT_KEYDN = 0x0
    KEYEVENT_KEYUP = 0x2
    VK_SHIFT = 0x10
    VK_CTRL = 0x11
    VK_ALT = 0x12
    VK_UP = 0x26
    VK_DOWN = 0x28
    VK_TAB = 0x09
    VK_OEM_COMMA = 0xBC
    VK_OEM_1 = 0xBA
    VK_ESCAPE = 0x1B
    VK_OEM_PLUS = 0xBB
    VK_OEM_MINUS = 0xBD
    VK_OEM_PERIOD = 0xBE
    VK_SPACE = 0x20
    VK_NUMPAD0 = 0x60 # offset numeric keypad 0
     
    def outputtext(text):
    	for c in text:
    		outputkey(c)
     
    def outputkey(src, ctrl = False, shift = False, alt = False):
    	if ctrl: win32api.keybd_event(VK_CTRL, 0, 0, 0)
    	if alt: win32api.keybd_event(VK_ALT, 0, 0, 0)
    	if src == ',':
    		if shift: win32api.keybd_event(VK_SHIFT, 0, 0, 0)
    		win32api.keybd_event(VK_OEM_COMMA, 0, 0, 0)
    		win32api.keybd_event(VK_OEM_COMMA, 0, KEYEVENT_KEYUP, 0)
    	elif src == '+':
    		shift = True
    		win32api.keybd_event(VK_SHIFT, 0, 0, 0)
    		win32api.keybd_event(VK_OEM_PLUS, 0, 0, 0)
    		win32api.keybd_event(VK_OEM_PLUS, 0, KEYEVENT_KEYUP, 0)
    	elif src == '=':
    		win32api.keybd_event(VK_OEM_PLUS, 0, 0, 0)
    		win32api.keybd_event(VK_OEM_PLUS, 0, KEYEVENT_KEYUP, 0)
    	elif src == '-':
    		if shift: win32api.keybd_event(VK_SHIFT, 0, 0, 0)
    		win32api.keybd_event(VK_OEM_MINUS, 0, 0, 0)
    		win32api.keybd_event(VK_OEM_MINUS, 0, KEYEVENT_KEYUP, 0)
    	elif src == '_':
    		shift = True
    		if shift: win32api.keybd_event(VK_SHIFT, 0, 0, 0)
    		win32api.keybd_event(VK_OEM_MINUS, 0, 0, 0)
    		win32api.keybd_event(VK_OEM_MINUS, 0, KEYEVENT_KEYUP, 0)
    	elif src == ' ':
    		if shift: win32api.keybd_event(VK_SHIFT, 0, 0, 0)
    		win32api.keybd_event(VK_SPACE, 0, 0, 0)
    		win32api.keybd_event(VK_SPACE, 0, KEYEVENT_KEYUP, 0)
    	elif src == '.':
    		if shift: win32api.keybd_event(VK_SHIFT, 0, 0, 0)
    		win32api.keybd_event(VK_OEM_PERIOD, 0, 0, 0)
    		win32api.keybd_event(VK_OEM_PERIOD, 0, KEYEVENT_KEYUP, 0)
    	elif src.isdigit():
    		chr = VK_NUMPAD0 + int(src)
    		win32api.keybd_event(chr, chr, 0, 0)
    		win32api.keybd_event(chr, chr, KEYEVENT_KEYUP, 0)
    	else:
    		chr = ord(src.upper())
    		if src.isupper(): shift = True
    		if shift: win32api.keybd_event(VK_SHIFT, 0, 0, 0)
    		win32api.keybd_event(chr, win32api.MapVirtualKey(chr,0), 0, 0)
    		win32api.keybd_event(chr, win32api.MapVirtualKey(chr,0), KEYEVENT_KEYUP, 0)
    	if shift: win32api.keybd_event(VK_SHIFT,0, KEYEVENT_KEYUP, 0)
    	if alt: win32api.keybd_event(VK_ALT,0, KEYEVENT_KEYUP, 0)
    	if ctrl: win32api.keybd_event(VK_CTRL,0, KEYEVENT_KEYUP, 0)
    	time.sleep(0.05)
     
    if __name__ == "__main__" :
    	input = sys.argv[1]
    	print("input :", input)
    	outputtext(input)
    J'ai ajouté le lien vers les codes de toutes les touches. Ces codes sont accessibles dans le module win32con (que je n'ai pas utilisé dans l'exemple) :
    http://msdn.microsoft.com/en-us/library/dd375731

  7. #7
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 696
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 696
    Par défaut
    Salut,

    Citation Envoyé par Knightdead Voir le message
    J'ai absolument rien compris au post vers lequel tu m'as dirigé, mais j'ai de tout de façon trouvé tout seul, sans n'avoir aucun module à rajouter.
    Ben désolé et tant mieux.
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

Discussions similaires

  1. [WD17] Simulation d'entré clavier vers fenêtre cible
    Par aldebaran974 dans le forum WinDev
    Réponses: 0
    Dernier message: 26/06/2014, 09h56
  2. [Batch] Simuler entrée clavier - MS-DOS
    Par Tohade dans le forum Scripts/Batch
    Réponses: 2
    Dernier message: 21/03/2013, 09h08
  3. Simuler évènements utilisateur (clic souris, entrée clavier)
    Par _vince_ dans le forum Bibliothèques tierces
    Réponses: 5
    Dernier message: 28/11/2011, 18h44
  4. Réponses: 1
    Dernier message: 20/11/2010, 11h11
  5. Réponses: 7
    Dernier message: 19/04/2007, 13h33

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