Simuler touche clavier

Utilisateur anonyme - Modifié le 18 nov. 2010 à 22:05
 Utilisateur anonyme - 18 nov. 2010 à 22:05
Hello,

Je cherche à simuler la pression d'une touche clavier.

J'ai déjà testé avec SendKeys, seulement SendKeys envoi telle touche dans telle fenêtre Windows, or ici je veux qu'il envoye comme une vrai impulsion clavier.

J'ai en fait un programme qui fait telle action quand on appuie par exemple sur F8, mais ce programme tourne en background donc impossible de dire avec un SendKeys qu'il doit envoyer l'impulsion f8 a telle fenêtre. Il faut donc un SendKeys qui envoi un F8 comme un clavier, et pas dans une fenêtre précise. Vous me suivez ?

Merci :-)

A++

26 réponses

Utilisateur anonyme
14 nov. 2010 à 14:43
Bonjour,
Tu as tout ce qu'il te faut sur msdn
A lire jusqu'à la fin bien entendu, surtout la remarque.
0
Utilisateur anonyme
14 nov. 2010 à 14:53
oups, une erreur de lien c'est sur ce lien
A bientôt.
0
Utilisateur anonyme
14 nov. 2010 à 15:09
Hello,

J'ai bien lu, mais comme dans mon cas je ne connais pas le nom de l'appli, et que l'appli attend bel et bien une vrai impulsion clavier, comment faire ? Dans la remarque, il montre l'exemple de la calculatrice, mais elle... on connait son nom.

A++

Fabien Schenkels (alias fabienfs)
0
Utilisateur anonyme
14 nov. 2010 à 15:41
Et en listant les process obtient-tu son titre ou son handle (IntPtr) ?
For Each p As Process In Process.GetProcesses()
    If Not p.MainWindowHandle = Nothing Then
        Debug.Print("---")
        Debug.Print(p.MainWindowHandle.ToString)
        Debug.Print(p.MainWindowTitle)
    End If
Next
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Utilisateur anonyme
14 nov. 2010 à 16:12
J'en reviens à ma question de base: n'est-il pas possible de simuler l'envoi d'une touche, comme un clavier, sans spécifier un processus de destination (programme) ?

Merci encore pour vos réponses

A++

Fabien Schenkels (alias fabienfs)
0
raffika Messages postés 269 Date d'inscription dimanche 31 mai 2009 Statut Membre Dernière intervention 12 mars 2011
14 nov. 2010 à 22:15
Salut,
cherches du coté de keybd_event dans les Api windows.
Bonsoir
0
raffika Messages postés 269 Date d'inscription dimanche 31 mai 2009 Statut Membre Dernière intervention 12 mars 2011
14 nov. 2010 à 22:17
Ps: C'est possible j'ai testé mais ça ne marche pas en VB2010 je ne sais pas pourquoi
0
raffika Messages postés 269 Date d'inscription dimanche 31 mai 2009 Statut Membre Dernière intervention 12 mars 2011
14 nov. 2010 à 22:19
0
raffika Messages postés 269 Date d'inscription dimanche 31 mai 2009 Statut Membre Dernière intervention 12 mars 2011
14 nov. 2010 à 23:02
Voici le lien dont je me suis inspiré
http://docvb.free.fr/apidetail.php?idapi=148
exemple :
Dim vvkey As Long = GetKeyState(&H41)

If vvkey <> 0 And vvkey <> 1 Then '' F12
keybd_event(&H8, TheForm, 0&, 0&)
keybd_event(&H64, TheForm, 0&, 0&)
fonction retourne 0 ou 1 lorsque la touche est inactive sinon -128 ou -127 lorsque la touche est enfoncée.
End If

Le t0ut dan5 un t1mer b0n501r
0
Utilisateur anonyme
14 nov. 2010 à 23:05
Hello,

Merci pour ta réponse. J'ai testé ceci :

    Private Declare Sub keybd_event Lib "user32" Alias "keybd_event" ( _
ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, _
ByVal dwExtraInfo As Long)
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim VK_ACTION As Long
        VK_ACTION = &H45
        Call keybd_event(VK_ACTION, 0, 0, 0)
        Call keybd_event(VK_ACTION, 0, 2, 0)
    End Sub


Mais sans résultat. Une idée ?

A++

Fabien Schenkels (alias fabienfs)
0
raffika Messages postés 269 Date d'inscription dimanche 31 mai 2009 Statut Membre Dernière intervention 12 mars 2011
14 nov. 2010 à 23:11
Salut,
ben je pense que le VK_ACTION est incorrect :
le code pour presser une touche est : &H8
pour la relacher : &H64
Ensuite, moi j'ai des zéros dans les deux derniers
paramètres, mon code est placé dans un timer à
Interval=1 et la touche pressée est un 'a'
dont le code est &H41, si je retrouve la liste
des codes de touches, je te l'enverrai si tu en
as besoin.
0
Utilisateur anonyme
14 nov. 2010 à 23:16
Je ne pige pas. Comment faire pour que lorsque je clique sur mon bouton, il me génère la pression de la lettre "e" (code 45) par exemple ?
J'avoue que j'ai un peu du mal à suivre

A++

Fabien Schenkels (alias fabienfs)
0
raffika Messages postés 269 Date d'inscription dimanche 31 mai 2009 Statut Membre Dernière intervention 12 mars 2011
14 nov. 2010 à 23:26
Moi même j'ai du mal à relire mon code source...
Et je n'ai plus la liste des codes des touches
Essayes ceci :
keybd_event(&H8, 0, 0&, 0&)
keybd_event(&H64, 0, 0&, 0&)

'keybd_event(&H8, TheForm, 0&, 0&)'j'ai mis en commentaires
'keybd_event(&H61, TheForm, 0&, 0&)'ces deux là
Car je pense que l'envoie des touches est trop bref
pour que windows les acceptent...
Sinon les deux premières lignes envoie la touche 4
et les deux suivantes en commentaire envoie la touche 1
Il faut peut être faire un Sleep entre les deux,
mais pour mon programme de remplacement des touches,
ça fonctionne sans aucun problème, je ne sais pas pourquoi.
0
raffika Messages postés 269 Date d'inscription dimanche 31 mai 2009 Statut Membre Dernière intervention 12 mars 2011
14 nov. 2010 à 23:27
ps : Et puis le &h8 est envoyé avant le &h64...
0
Utilisateur anonyme
14 nov. 2010 à 23:29
Donc comme ceci :

    Declare Sub keybd_event Lib "user32" Alias "keybd_event" ( _
                 ByVal bVk As Byte, _
                 ByVal bScan As Byte, _
                 ByVal dwFlags As Long, _
                 ByVal dwExtraInfo As Long)

    Private Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer


    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim vvkey As Long = GetKeyState(&H41)

        If vvkey <> 0 And vvkey <> 1 Then '' F12
            keybd_event(&H8, 0, 0&, 0&)
            Thread.Sleep(20)
            keybd_event(&H64, 0, 0&, 0&)
        End If

    End Sub


Fonctionne pas :-(

A++

Fabien Schenkels (alias fabienfs)
0
raffika Messages postés 269 Date d'inscription dimanche 31 mai 2009 Statut Membre Dernière intervention 12 mars 2011
14 nov. 2010 à 23:38
Non, plutôt comme ceci :
 Declare Sub keybd_event Lib "user32" Alias "keybd_event" ( _
                 ByVal bVk As Byte, _
                 ByVal bScan As Byte, _
                 ByVal dwFlags As Long, _
                 ByVal dwExtraInfo As Long)

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        TextBox1.Focus()''Donne le focus au textbox
        keybd_event(&H8, 0, 0&, 0&)''envoie la 
        keybd_event(&H64, 0, 0&, 0&)''touche '1'
End Sub

Il faut rajouter un Textbox au projet car si
une touche est pressée lorsque le bouton est actif
tu ne pourras pas voir le résultat.
0
Utilisateur anonyme
14 nov. 2010 à 23:42
Il me renvoi '4' dans le textbox. Ca signifie ?

A++

Fabien Schenkels (alias fabienfs)
0
raffika Messages postés 269 Date d'inscription dimanche 31 mai 2009 Statut Membre Dernière intervention 12 mars 2011
14 nov. 2010 à 23:47
Ah oui, en même temps j'ai compris d'où venait le
problème, &H8 correspond à la touche Supprimer !
C'est donc pour ça que ça ne marchais qu'une fois.
Ce qui signifie que pour simuler une pression de la touche "e"
ce code suffit :
keybd_event(&H45, 0, 0&, 0&)
0
Utilisateur anonyme
14 nov. 2010 à 23:51
Ok, donc la il m'écrit bien mon "e" dans mon TextBox, mais mon problème initial est que je voudrais simuler l'envoi d'une impulsion clavier, sans définir une destination. J'ai un programme qui quand j'appuie sur le F8 de mon clavier déclenche une action. Ce programme est en background. Comment faire pour qu'il ressoive cette impulsion clavier ?

merci

A++

Fabien Schenkels (alias fabienfs)
0
raffika Messages postés 269 Date d'inscription dimanche 31 mai 2009 Statut Membre Dernière intervention 12 mars 2011
15 nov. 2010 à 00:01
Ah dans ce cas là il faut utiliser GetKeyState :
Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer
Ensuite dans un Timer :
Dim vvkey As Long = GetKeyState(&H41) '' &H41 correpond à la touche "a"
If vvkey <> 0 And vvkey <> 1 Then '' Touche 'a' pressée
msgbox("'a' pressé")
end if
Il ne te reste plus qu'a trouver le code pour la touche F8
Il existe surement une méthode sans Api,
mais je ne la connais pas. Bonsoir
0
Rejoignez-nous