VB.NET: Savoir si une touche est pressée en dehors de la form [Résolu/Fermé]

Signaler
Messages postés
677
Date d'inscription
samedi 6 octobre 2012
Statut
Membre
Dernière intervention
10 juin 2020
-
Messages postés
6868
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
7 août 2020
-
Bonjour,

J'ai une application vb.net qui tourne en fond, et qui effectue différents actions selon la touche pressée.
Avec les raccourcis des contextmenustrip, ça marche, mais il faut que la form soit le formulaire actif.
Si on est sur une autre fenêtre, ça ne marche pas.
Je voudrais donc savoir comment faire pour que les raccourcis fonctionnent même si mon programme n'est pas la fenêtre active.

8 réponses

Messages postés
6868
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
7 août 2020
535
Bonjour,

C'est très simple, si tu es dans un autre form pour lancer l'action tu précèdes le bouton qui déclenche l'action du nom de ton formulaire principal, comme ceci:

Dans le form principal:

Public Class Form1

    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
        MsgBox("essai")
    End Sub

    Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
        Form2.ShowDialog()
    End Sub
End Class


Dans le Form2

Public Class Form2

    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
        Form1.Button1.PerformClick()
    End Sub
End Class
Messages postés
677
Date d'inscription
samedi 6 octobre 2012
Statut
Membre
Dernière intervention
10 juin 2020
13
Bonjour,

Je ne parlais pas de boutons, mais de touches du clavier.

Excusez-moi si je me suis mal exprimé, quand j'ai dit qu'une autre fenêtre était active, je parlais d'un autre programme, pas d'une autre form de mon application.
Messages postés
6868
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
7 août 2020
535
Peut-être en mettant la propriété TopMost du Form à True , comme ceci:

 Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        Me.TopMost = True
    End Sub

Messages postés
677
Date d'inscription
samedi 6 octobre 2012
Statut
Membre
Dernière intervention
10 juin 2020
13
J'ai essayé, la form est toujours visible, mais n'est plus la fenêtre active lorsque l'on va sur un autre programme.
Messages postés
677
Date d'inscription
samedi 6 octobre 2012
Statut
Membre
Dernière intervention
10 juin 2020
13
up
Messages postés
6868
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
7 août 2020
535
Messages postés
677
Date d'inscription
samedi 6 octobre 2012
Statut
Membre
Dernière intervention
10 juin 2020
13
Je ne comprends pas le rapport avec mon problème.
Je ne veux pas ouvrir une autre application, mais capter les touches appuyées n'importe quand (par exemple, si j'appuie sur Google Chrome, mon programme doit être capable de savoir quelle touche j'ai pressé.
Messages postés
6868
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
7 août 2020
535
OK, j'ai compris. Il faut un Timer pour activer le Form toutes les x secondes comme ceci:


Public Class Form1
    Private Sub Form1_FormClosing(sender As Object, e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
        Timer1.Stop()
    End Sub
    Private Sub Form1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
        MsgBox(e.KeyCode)
     End Sub
    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        Me.TopMost = True
        Timer1.Interval = 1000 '1 seconde a adapter
        Timer1.Start()
    End Sub
    Private Sub Timer1_Tick(sender As System.Object, e As System.EventArgs) Handles Timer1.Tick
        Me.Activate()
    End Sub
End Class


Messages postés
677
Date d'inscription
samedi 6 octobre 2012
Statut
Membre
Dernière intervention
10 juin 2020
13
Ce n'est pas du tout ce que je veux.
Avec cette méthode, il est impossible d'utiliser un autre programme en même temps, la fenêtre s'active toutes les secondes....
Ce que je veux, c'est que l'on puisse utiliser une autre application en même temps, mais que, lorsqu'on appuie sur une touche, mon programme la capte automatiquement.
Messages postés
6868
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
7 août 2020
535
Je ne vois plus que l'utilisation du contrôle NotifyIcon qui au clic activera le Form . N'oublies pas de mettre une icône dans la propriété Icon du NotifyIcon


  Private Sub NotifyIcon1_MouseClick(sender As Object, e As System.Windows.Forms.MouseEventArgs) Handles NotifyIcon1.MouseClick
        Me.Activate()
    End Sub


Bon continuation, je suis a bout d'argument
Messages postés
677
Date d'inscription
samedi 6 octobre 2012
Statut
Membre
Dernière intervention
10 juin 2020
13
On est obligé de cliquer sur le notifyicon pour activer la form, ce n'est pas plus pratique que d'activer manuellement la fenêtre à chaque fois......
De plus, le notifyicon ne peut pas capter de touches.
Messages postés
6868
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
7 août 2020
535
Il faut que tu comprennes que pour capter les touches clavier, il faut que ton Form soit Actif. La seule solution est le Timer qui active le Form toutes les x secondes. Je n'ai plus rien à ajouter à ce constat!

Bon courage
Messages postés
677
Date d'inscription
samedi 6 octobre 2012
Statut
Membre
Dernière intervention
10 juin 2020
13
Dans ce cas, comment font les logiciels de KeyLogger?
Ils arrivent bien à capter les touches tapées sans qu'on ait besoin de les activer...
(Je vous rassure, je ne suis pas en train d'en faire un)
Messages postés
677
Date d'inscription
samedi 6 octobre 2012
Statut
Membre
Dernière intervention
10 juin 2020
13
Bonjour,
J'ai trouvé comment contourner mon problème:
Par exemple, si le raccourci est Ctrl + A:

Private Declare Function GetAsyncKeyState Lib "user32" (ByVal sKey As Int32) As Int16

Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
   Timer1.Interval = 1
End Sub

Private Sub Timer1_Tick(sender As System.Object, e As System.EventArgs) Handles Timer1.Tick
   For i = 0 To 255
      Dim result = GetAsyncKeyState(i)
      If result = -32767 Then
         'ligne ci dessous à adapter selon les touches voulues.
         If i = Keys.A And My.Computer.Keyboard.CtrlKeyDown Then
            'action a exécuter.
         End If
      End If
   Next i
End Sub


Je me suis adapté du code d'un KeyLogger.
Merci quand même pour le temps que vous m'avez consacré.
(Cependant, il est conseillé de ne pas utiliser de raccourcis couramment utilisés par d'autres applications: l'application active traitera quand-même le code associé à la combinaison de touches)

On ne peut pas capter lorsqu'une touche est pressée, mais on peut savoir si une touche est pressée.
Messages postés
6868
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
7 août 2020
535 >
Messages postés
677
Date d'inscription
samedi 6 octobre 2012
Statut
Membre
Dernière intervention
10 juin 2020

Et pour conclure nous arrivons au KeyLogger.

Voici un programme qui détecte les touches pressées, même quand le Form n'est pas actif:

https://codes-sources.commentcamarche.net/source/49352-keylogger-vb-net-2008-v9-class-hook-pour-clavier-fr-et-vista