Simuler touche clavier

Signaler
-
 Utilisateur anonyme -
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


Bonjour,
Tu as tout ce qu'il te faut sur msdn
A lire jusqu'à la fin bien entendu, surtout la remarque.

oups, une erreur de lien c'est sur ce lien
A bientôt.

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)

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

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)
Messages postés
269
Date d'inscription
dimanche 31 mai 2009
Statut
Membre
Dernière intervention
12 mars 2011

Salut,
cherches du coté de keybd_event dans les Api windows.
Bonsoir
Messages postés
269
Date d'inscription
dimanche 31 mai 2009
Statut
Membre
Dernière intervention
12 mars 2011

Ps: C'est possible j'ai testé mais ça ne marche pas en VB2010 je ne sais pas pourquoi
Messages postés
269
Date d'inscription
dimanche 31 mai 2009
Statut
Membre
Dernière intervention
12 mars 2011

Messages postés
269
Date d'inscription
dimanche 31 mai 2009
Statut
Membre
Dernière intervention
12 mars 2011

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

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)
Messages postés
269
Date d'inscription
dimanche 31 mai 2009
Statut
Membre
Dernière intervention
12 mars 2011

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.

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)
Messages postés
269
Date d'inscription
dimanche 31 mai 2009
Statut
Membre
Dernière intervention
12 mars 2011

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.
Messages postés
269
Date d'inscription
dimanche 31 mai 2009
Statut
Membre
Dernière intervention
12 mars 2011

ps : Et puis le &h8 est envoyé avant le &h64...

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)
Messages postés
269
Date d'inscription
dimanche 31 mai 2009
Statut
Membre
Dernière intervention
12 mars 2011

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.

Il me renvoi '4' dans le textbox. Ca signifie ?

A++

Fabien Schenkels (alias fabienfs)
Messages postés
269
Date d'inscription
dimanche 31 mai 2009
Statut
Membre
Dernière intervention
12 mars 2011

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&)

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)
Messages postés
269
Date d'inscription
dimanche 31 mai 2009
Statut
Membre
Dernière intervention
12 mars 2011

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