VB.NET: Savoir si une touche est pressée en dehors de la form

Résolu/Fermé
Anonyme209 Messages postés 678 Date d'inscription samedi 6 octobre 2012 Statut Membre Dernière intervention 22 décembre 2020 - 8 févr. 2015 à 14:37
cs_Le Pivert Messages postés 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024 - 14 févr. 2015 à 15:22
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.
A voir également:

8 réponses

cs_Le Pivert Messages postés 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024 728
8 févr. 2015 à 15:01
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
0
Anonyme209 Messages postés 678 Date d'inscription samedi 6 octobre 2012 Statut Membre Dernière intervention 22 décembre 2020 15
8 févr. 2015 à 15:51
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.
0
cs_Le Pivert Messages postés 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024 728
8 févr. 2015 à 17:44
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

0
Anonyme209 Messages postés 678 Date d'inscription samedi 6 octobre 2012 Statut Membre Dernière intervention 22 décembre 2020 15
8 févr. 2015 à 18:37
J'ai essayé, la form est toujours visible, mais n'est plus la fenêtre active lorsque l'on va sur un autre programme.
0
Anonyme209 Messages postés 678 Date d'inscription samedi 6 octobre 2012 Statut Membre Dernière intervention 22 décembre 2020 15
11 févr. 2015 à 17:41
up
0

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

Posez votre question
cs_Le Pivert Messages postés 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024 728
11 févr. 2015 à 18:50
0
Anonyme209 Messages postés 678 Date d'inscription samedi 6 octobre 2012 Statut Membre Dernière intervention 22 décembre 2020 15
12 févr. 2015 à 17:33
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é.
0
cs_Le Pivert Messages postés 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024 728
13 févr. 2015 à 14:33
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


0
Anonyme209 Messages postés 678 Date d'inscription samedi 6 octobre 2012 Statut Membre Dernière intervention 22 décembre 2020 15
13 févr. 2015 à 15:10
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.
0
cs_Le Pivert Messages postés 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024 728
14 févr. 2015 à 09:00
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
0
Anonyme209 Messages postés 678 Date d'inscription samedi 6 octobre 2012 Statut Membre Dernière intervention 22 décembre 2020 15
14 févr. 2015 à 11: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.
0
cs_Le Pivert Messages postés 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024 728
14 févr. 2015 à 12:14
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
0
Anonyme209 Messages postés 678 Date d'inscription samedi 6 octobre 2012 Statut Membre Dernière intervention 22 décembre 2020 15
14 févr. 2015 à 14:22
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)
0
Anonyme209 Messages postés 678 Date d'inscription samedi 6 octobre 2012 Statut Membre Dernière intervention 22 décembre 2020 15
Modifié par Anonyme209 le 14/02/2015 à 15:00
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.
0
cs_Le Pivert Messages postés 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024 728 > Anonyme209 Messages postés 678 Date d'inscription samedi 6 octobre 2012 Statut Membre Dernière intervention 22 décembre 2020
14 févr. 2015 à 15:22
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
0