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
    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 expérimenté
    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
    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 expérimenté
    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
    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
    Membre expert
    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
    Membre expert
    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
    Mon Covid Tracker alias Coronavirus : https://covid.ovh/