Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Contrôle Timer et évènements clavier

6 réponses
Avatar
Sergio
Bonjour,

voici mon code :
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
Private Sub Form_Load ()
Keypreview=3DTrue
Timer1.Interval=3D100
....
end sub

Private Sub Timer1_Timer()
....
....
End sub

Private Sub Form_KeyDown (KeyCode as Integer,Shift as=20
Integer)
If Keycode=3DvbKeySpace then
.....

end if
End sub
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
Voici mon probl=E8me :
Pendant que le Timer1 se r=E9alise tous les 100 ms, je=20
voudrais que lorsque j'appuie sur la barre d'espace faire=20
une action; mais pour cela la Form doit avoir le focus.=20
Or tous les 100 ms c'est le Timer1 qui a le focus; ce qui=20
m'emp=EAche d'acc=E9der =E0 l'=E9v=E8nement "barre d'espace".=20
Comment faire ?
Ai-je =E9t=E9 assez clair dans mes explications ? Quelqu'un=20
a -t-il une r=E9ponse ?

Merci beaucoup pour votre contribution.
Salutations.

6 réponses

Avatar
Ludovic SOEUR
tu peux essayer d'utiliser l'API :
Public Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long)
As Integer 'pour le esc dans la preview

Dans ton timer, tu places
If GetAsyncKeyState(vbKeySpace) < 0 Then 'Récupère l'évènement de la touche
Espace
maForm.keyDown Form_KeyDown,monShift 'Transfère l'évènement à la form.
monShift doit être calculé s'il est utilisé, sinon, on peut mettre 0
Exit Function


"Sergio" a écrit dans le message de
news: 54cd01c42cf9$4e61d610$
Bonjour,

voici mon code :
======================================== Private Sub Form_Load ()
Keypreview=True
Timer1.Interval0
....
end sub

Private Sub Timer1_Timer()
....
....
End sub

Private Sub Form_KeyDown (KeyCode as Integer,Shift as
Integer)
If Keycode=vbKeySpace then
.....

end if
End sub
====================================== Voici mon problème :
Pendant que le Timer1 se réalise tous les 100 ms, je
voudrais que lorsque j'appuie sur la barre d'espace faire
une action; mais pour cela la Form doit avoir le focus.
Or tous les 100 ms c'est le Timer1 qui a le focus; ce qui
m'empêche d'accéder à l'évènement "barre d'espace".
Comment faire ?
Ai-je été assez clair dans mes explications ? Quelqu'un
a -t-il une réponse ?

Merci beaucoup pour votre contribution.
Salutations.
Avatar
ng
Salut,

Les objets timer étant invisible, je ne vois pas pourquoi il auraient le
focus !

Ce code fonctionne parfaitement :

Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
If KeyCode = vbKeySpace Then
MsgBox "test"
End If
End Sub

Private Sub Form_Load()
Me.KeyPreview = True
Timer1.Interval = 100
Timer1.Enabled = True
End Sub

Private Sub Timer1_Timer()
Me.Caption = Timer
End Sub


--
Nicolas G.
FAQ VB : http://faq.vb.free.fr
API Guide : http://www.allapi.net
Google Groups : http://groups.google.fr/
MZ-Tools : http://www.mztools.com/
http://apisvb.europe.webmatrixhosting.net/

Sergio a écrit :

Bonjour,

voici mon code :
======================================== > Private Sub Form_Load ()
Keypreview=True
Timer1.Interval0
....
end sub

Private Sub Timer1_Timer()
....
....
End sub

Private Sub Form_KeyDown (KeyCode as Integer,Shift as
Integer)
If Keycode=vbKeySpace then
.....

end if
End sub
====================================== > Voici mon problème :
Pendant que le Timer1 se réalise tous les 100 ms, je
voudrais que lorsque j'appuie sur la barre d'espace faire
une action; mais pour cela la Form doit avoir le focus.
Or tous les 100 ms c'est le Timer1 qui a le focus; ce qui
m'empêche d'accéder à l'évènement "barre d'espace".
Comment faire ?
Ai-je été assez clair dans mes explications ? Quelqu'un
a -t-il une réponse ?

Merci beaucoup pour votre contribution.
Salutations.


Avatar
Ludovic SOEUR
Je ne suis pas d'accord avec toi ng....il se peut que Sergio ait un
composant sur sa Form qui fait que ca ne marche pas. Je m'explique :

Si j'ai proposé le bout de code précédemment, c'est que j'ai eu le même
problème que Sergio et que j'ai pas mal galéré avant de trouver cette
solution.
Il suffit que ta form possède un composant que détourne les interruptions
clavier pour que certaines touches ne soient plus accessible dans KeyDown,
malgré le KeyPreview à true, comme la touche Espace, la touche Escape,
Ctrl+C, Ctrl+V, Ctrl+X et j'en passe. Pour certains composants, il suffit
simplement de détourner leur WndProc mais pour d'autres (celui qui me posait
problème est Flash.OCX pour ne pas le citer), cela ne suffit pas. Suivant le
cas, le principe du timer marche bien, sinon, il faut aller dans les APIs et
utiliser RegisterHotKeys (ce fut mon cas pour Ctrl+C,Ctrl+V et Ctrl+X).


"ng" a écrit dans le message de news:
#
Salut,

Les objets timer étant invisible, je ne vois pas pourquoi il auraient le
focus !

Ce code fonctionne parfaitement :

Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
If KeyCode = vbKeySpace Then
MsgBox "test"
End If
End Sub

Private Sub Form_Load()
Me.KeyPreview = True
Timer1.Interval = 100
Timer1.Enabled = True
End Sub

Private Sub Timer1_Timer()
Me.Caption = Timer
End Sub


--
Nicolas G.
FAQ VB : http://faq.vb.free.fr
API Guide : http://www.allapi.net
Google Groups : http://groups.google.fr/
MZ-Tools : http://www.mztools.com/
http://apisvb.europe.webmatrixhosting.net/

Sergio a écrit :

> Bonjour,
>
> voici mon code :
> ======================================== > > Private Sub Form_Load ()
> Keypreview=True
> Timer1.Interval0
> ....
> end sub
>
> Private Sub Timer1_Timer()
> ....
> ....
> End sub
>
> Private Sub Form_KeyDown (KeyCode as Integer,Shift as
> Integer)
> If Keycode=vbKeySpace then
> .....
>
> end if
> End sub
> ====================================== > > Voici mon problème :
> Pendant que le Timer1 se réalise tous les 100 ms, je
> voudrais que lorsque j'appuie sur la barre d'espace faire
> une action; mais pour cela la Form doit avoir le focus.
> Or tous les 100 ms c'est le Timer1 qui a le focus; ce qui
> m'empêche d'accéder à l'évènement "barre d'espace".
> Comment faire ?
> Ai-je été assez clair dans mes explications ? Quelqu'un
> a -t-il une réponse ?
>
> Merci beaucoup pour votre contribution.
> Salutations.




Avatar
ng
Salut,

Je suis d'accord avec ça, je persiste cependant en disant que ca n'a rien à
voir avec le Timer car il ne peut pas avoir le focus !

--
Nicolas G.
FAQ VB : http://faq.vb.free.fr
API Guide : http://www.allapi.net
Google Groups : http://groups.google.fr/
MZ-Tools : http://www.mztools.com/
http://apisvb.europe.webmatrixhosting.net/

Ludovic SOEUR a écrit :

Je ne suis pas d'accord avec toi ng....il se peut que Sergio ait un
composant sur sa Form qui fait que ca ne marche pas. Je m'explique :

Si j'ai proposé le bout de code précédemment, c'est que j'ai eu le
même problème que Sergio et que j'ai pas mal galéré avant de trouver
cette solution.
Il suffit que ta form possède un composant que détourne les
interruptions clavier pour que certaines touches ne soient plus
accessible dans KeyDown, malgré le KeyPreview à true, comme la touche
Espace, la touche Escape, Ctrl+C, Ctrl+V, Ctrl+X et j'en passe. Pour
certains composants, il suffit simplement de détourner leur WndProc
mais pour d'autres (celui qui me posait problème est Flash.OCX pour
ne pas le citer), cela ne suffit pas. Suivant le cas, le principe du
timer marche bien, sinon, il faut aller dans les APIs et utiliser
RegisterHotKeys (ce fut mon cas pour Ctrl+C,Ctrl+V et Ctrl+X).


"ng" a écrit dans le message de news:
#
Salut,

Les objets timer étant invisible, je ne vois pas pourquoi il
auraient le focus !

Ce code fonctionne parfaitement :

Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
If KeyCode = vbKeySpace Then
MsgBox "test"
End If
End Sub

Private Sub Form_Load()
Me.KeyPreview = True
Timer1.Interval = 100
Timer1.Enabled = True
End Sub

Private Sub Timer1_Timer()
Me.Caption = Timer
End Sub


--
Nicolas G.
FAQ VB : http://faq.vb.free.fr
API Guide : http://www.allapi.net
Google Groups : http://groups.google.fr/
MZ-Tools : http://www.mztools.com/
http://apisvb.europe.webmatrixhosting.net/

Sergio a écrit :

Bonjour,

voici mon code :
======================================== >>> Private Sub Form_Load ()
Keypreview=True
Timer1.Interval0
....
end sub

Private Sub Timer1_Timer()
....
....
End sub

Private Sub Form_KeyDown (KeyCode as Integer,Shift as
Integer)
If Keycode=vbKeySpace then
.....

end if
End sub
====================================== >>> Voici mon problème :
Pendant que le Timer1 se réalise tous les 100 ms, je
voudrais que lorsque j'appuie sur la barre d'espace faire
une action; mais pour cela la Form doit avoir le focus.
Or tous les 100 ms c'est le Timer1 qui a le focus; ce qui
m'empêche d'accéder à l'évènement "barre d'espace".
Comment faire ?
Ai-je été assez clair dans mes explications ? Quelqu'un
a -t-il une réponse ?

Merci beaucoup pour votre contribution.
Salutations.






Avatar
Ludovic SOEUR
D'accord aussi avec le fait que le Timer ne peut pas avoir le focus.

"ng" a écrit dans le message de news:

Salut,

Je suis d'accord avec ça, je persiste cependant en disant que ca n'a rien


à
voir avec le Timer car il ne peut pas avoir le focus !

--
Nicolas G.
FAQ VB : http://faq.vb.free.fr
API Guide : http://www.allapi.net
Google Groups : http://groups.google.fr/
MZ-Tools : http://www.mztools.com/
http://apisvb.europe.webmatrixhosting.net/

Ludovic SOEUR a écrit :

> Je ne suis pas d'accord avec toi ng....il se peut que Sergio ait un
> composant sur sa Form qui fait que ca ne marche pas. Je m'explique :
>
> Si j'ai proposé le bout de code précédemment, c'est que j'ai eu le
> même problème que Sergio et que j'ai pas mal galéré avant de trouver
> cette solution.
> Il suffit que ta form possède un composant que détourne les
> interruptions clavier pour que certaines touches ne soient plus
> accessible dans KeyDown, malgré le KeyPreview à true, comme la touche
> Espace, la touche Escape, Ctrl+C, Ctrl+V, Ctrl+X et j'en passe. Pour
> certains composants, il suffit simplement de détourner leur WndProc
> mais pour d'autres (celui qui me posait problème est Flash.OCX pour
> ne pas le citer), cela ne suffit pas. Suivant le cas, le principe du
> timer marche bien, sinon, il faut aller dans les APIs et utiliser
> RegisterHotKeys (ce fut mon cas pour Ctrl+C,Ctrl+V et Ctrl+X).
>
>
> "ng" a écrit dans le message de news:
> #
>> Salut,
>>
>> Les objets timer étant invisible, je ne vois pas pourquoi il
>> auraient le focus !
>>
>> Ce code fonctionne parfaitement :
>>
>> Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
>> If KeyCode = vbKeySpace Then
>> MsgBox "test"
>> End If
>> End Sub
>>
>> Private Sub Form_Load()
>> Me.KeyPreview = True
>> Timer1.Interval = 100
>> Timer1.Enabled = True
>> End Sub
>>
>> Private Sub Timer1_Timer()
>> Me.Caption = Timer
>> End Sub
>>
>>
>> --
>> Nicolas G.
>> FAQ VB : http://faq.vb.free.fr
>> API Guide : http://www.allapi.net
>> Google Groups : http://groups.google.fr/
>> MZ-Tools : http://www.mztools.com/
>> http://apisvb.europe.webmatrixhosting.net/
>>
>> Sergio a écrit :
>>
>>> Bonjour,
>>>
>>> voici mon code :
>>> ======================================== > >>> Private Sub Form_Load ()
>>> Keypreview=True
>>> Timer1.Interval0
>>> ....
>>> end sub
>>>
>>> Private Sub Timer1_Timer()
>>> ....
>>> ....
>>> End sub
>>>
>>> Private Sub Form_KeyDown (KeyCode as Integer,Shift as
>>> Integer)
>>> If Keycode=vbKeySpace then
>>> .....
>>>
>>> end if
>>> End sub
>>> ====================================== > >>> Voici mon problème :
>>> Pendant que le Timer1 se réalise tous les 100 ms, je
>>> voudrais que lorsque j'appuie sur la barre d'espace faire
>>> une action; mais pour cela la Form doit avoir le focus.
>>> Or tous les 100 ms c'est le Timer1 qui a le focus; ce qui
>>> m'empêche d'accéder à l'évènement "barre d'espace".
>>> Comment faire ?
>>> Ai-je été assez clair dans mes explications ? Quelqu'un
>>> a -t-il une réponse ?
>>>
>>> Merci beaucoup pour votre contribution.
>>> Salutations.




Avatar
François Picalausa
Hello!

il faut aller dans les APIs et utiliser
RegisterHotKeys



Question, que se passe-t-il si mon application veut aussi le ctrl+c?
"RegisterHotKey fails if the keystrokes specified for the hot key have
already been registered by another hot key."
Malheureusement, je ne crois pas que RegisterHotKey soit approprié.
Peut-être un contrôle HotKey?
Peut-être un hook clavier de l'application?
Sinon, effectivement GetAsyncKeyState... au risque de louper quelques
entrées...

--
François Picalausa (MVP VB)
http://faq.vb.free.fr --- http://msdn.microsoft.com
http://apisvb.europe.webmatrixhosting.net

"Ludovic SOEUR" a écrit dans le message de
news:
timer marche bien, sinon, il faut aller dans les APIs et utiliser
RegisterHotKeys (ce fut mon cas pour Ctrl+C,Ctrl+V et Ctrl+X).