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

VB.NET Discussion :

Action suite a une détection clavier


Sujet :

VB.NET

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4
    Points : 2
    Points
    2
    Par défaut Action suite a une détection clavier
    Bonjour,

    Dans le cadre d'un projet personnel j'ai besoin de pouvoir détecter l'utilisation d'une touche (dans mon cas c'est F3) et de répéter cette action le nombre de fois souhaitées.

    Je détecte donc la touche avec GetAsyncKeyState que j'ai déclaré et qui fonctionne, puis je renvoie cette même touche plusieurs fois avec SendKeys.
    Tout fonctionne sauf que pour une raison qui m'échappe à chaque boucle suivante du timer les 3 actions se répètent.. J'imagine qui considère le dernier F3 envoyé comme si je l'avais tapé moi même.

    Existe il un autre moyen de faire ce que je souhaite ? Ou peut être un moyen de différencier ce qui est tapé au clavier et envoyé de façon virtuelle ?

    Voici à quoi ressemble mon code.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
        Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
            If (GetAsyncKeyState(114)) Then
                SendKeys.Send("{F3}")
                System.Threading.Thread.Sleep(50)
                SendKeys.Send("{F3}")
                System.Threading.Thread.Sleep(50)
                SendKeys.Send("{F3}")
                System.Threading.Thread.Sleep(50)
            End If
        End Sub
    Merci à vous !!

  2. #2
    Membre émérite Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Points : 2 865
    Points
    2 865
    Par défaut
    Bonjour,

    L'utilisation de l'évènement KeyDown ne te conviendrait-elle pas ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
        Private Sub TextBox1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles TextBox1.KeyDown
            If e.KeyCode = Keys.F3 Then
                SendKeys.Send(Keys.F3)   ' le SendKeyn n'étant pas une Key Down, l'action ne se fait qu'une fois
            End If
        End Sub

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par Phil Rob Voir le message
    Bonjour,

    L'utilisation de l'évènement KeyDown ne te conviendrait-elle pas ?
    Merci pour ta réponse ! J'ai bien essayé d'explorer cette piste et l'event fonctionne mais il ne se fait que sur des éléments du projet..
    Là par exemple je dois sélectionner la textbox, hors il faudrait que ça fonctionne même si mon exécutable est réduit, je fais un utilitaire pour une autre appli.

    J'espère que tu auras une idée

  4. #4
    Membre émérite Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Points : 2 865
    Points
    2 865
    Par défaut
    Ce que tu demandes ne me parait pas possible, notamment parce que lorsque l'application est réduite, ou simplement que le focus est donné à un autre programme (NotePad.exe, par exemple), c'est le programme actif à ce moment (ou bien le système lui-même) qui a la possibilité de détecter l'appui de touches, dont F3.

    Il ne s'agit là que d'un avis personnel ..., j'espère que quelqu'un en sait plus que moi sur la question et qu'il t'informera.


  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Merci quand même

    J'ai même essayé de changer de méthode en utilisant RegisterHotKey, ça fonctionne mais ça me crée une boucle si j'envoie avec sendkeys la touche que j'ai mis en raccourci

  6. #6
    Expert confirmé
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 441
    Points
    4 441
    Par défaut
    bonjour
    Tout fonctionne sauf que pour une raison qui m'échappe à chaque boucle suivante du timer les 3 actions se répètent.. J'imagine qui considère le dernier F3 envoyé comme si je l'avais tapé moi même.
    Cmment le sais-tu?
    le code qui suit montre que le Timer n’émet que 3 SendKey() à chaque tic:

    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
     
     
    Imports System.Runtime.InteropServices
     
    Public Class Form1
     
        Public Const VK_F3 = &H72 'function key
        <DllImport("user32.dll", CharSet:=CharSet.Unicode)>
        Shared Function GetAsyncKeyState(ByVal vKey As Integer) As Integer
        End Function
        Private mark As String = "MARK"
        Private counter As Integer = 0
        Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
            Timer1.Interval = 500
            Timer1.Enabled = True
        End Sub
        Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
     
            Dim KEYEVENTF_KEYUP As Integer = Module1.GetAsyncKeyState(VK_F3)
            If KEYEVENTF_KEYUP <> 0 Then
     
                Me.Text = "F3 EST APPUYE"
     
                SendKeys.Send("{F3}")
                counter += 1
                TextBox1.Text += counter.ToString + Environment.NewLine
     
     
                System.Threading.Thread.Sleep(50)
                SendKeys.Send("{F3}")
                counter += 1
                TextBox1.Text += counter.ToString + Environment.NewLine
     
                System.Threading.Thread.Sleep(50)
                SendKeys.Send("{F3}")
                System.Threading.Thread.Sleep(50)
                counter += 1
                TextBox1.Text += counter.ToString + Environment.NewLine
                TextBox1.Text += mark + Environment.NewLine
     
     
            End If
        End Sub
     
     
     
    End Class
    bon code...

  7. #7
    Expert confirmé

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    2 065
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 2 065
    Points : 4 229
    Points
    4 229
    Par défaut
    Citation Envoyé par ColeTurner Voir le message
    Merci pour ta réponse ! J'ai bien essayé d'explorer cette piste et l'event fonctionne mais il ne se fait que sur des éléments du projet..
    Là par exemple je dois sélectionner la textbox, hors il faudrait que ça fonctionne même si mon exécutable est réduit, je fais un utilitaire pour une autre appli.

    J'espère que tu auras une idée
    Pour avoir fait des bots en C# c'est possible mais en passant par les API Win32
    https://www.pinvoke.net/default.aspx/user32.sendmessage
    avec send message tu peux envoyer tout un tas de fonction a une fenetre, simulé un click de souris, l'envoie d'une touche ..., il te faut juste l'identifiant de la fenêtre et le code du type de message que tu veux envoyer

Discussions similaires

  1. Réponses: 3
    Dernier message: 05/04/2011, 01h00
  2. Réponses: 19
    Dernier message: 09/07/2008, 18h42
  3. [WD10] Exécuter une action suite au clic de la souris
    Par lepirate dans le forum WinDev
    Réponses: 1
    Dernier message: 07/02/2008, 22h35
  4. action en enfoncant une touche du clavier
    Par Micklabrute dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 12/07/2007, 00h38
  5. [Struts] Fermer un Pop up à la suite d'une action
    Par Sniper37 dans le forum Struts 1
    Réponses: 2
    Dernier message: 10/03/2005, 13h58

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