OVH Cloud OVH Cloud

A "ng" : Suite de Sendkeys est trop lent

4 réponses
Avatar
Yves Boyer
<Essaye l'API keyb_event :>

Merci, mais ça ne donne rien de bon.
En fait il est impossible d'enchaîner des SendKeys (ou des keybd_event) car
VB mélange tout. Si j'écris :

prog = "C:\Program Files\Tidy\htmlTrim\HTMLTrim.exe"
htmVal = Shell(prog, 1)
AppActivate htmVal
ChDir "C:\TidyAZ"

SendKeys "L", True ' Appelle Load
SendKeys "htm.tdy", True
' Met le focus sur Ouvre :
keybd_event VK_%, 0, KEYEVENTF_KEYUP, 0 ' release %
keybd_event VK_O, 0, KEYEVENTF_KEYUP, 0 ' release O
' Met le focus sur Add
keybd_event VK_%, 0, KEYEVENTF_KEYUP, 0 ' release %
keybd_event VK_A, 0, KEYEVENTF_KEYUP, 0 ' release A
SendKeys "test.htm", True
keybd_event VK_%, 0, KEYEVENTF_KEYUP, 0 ' release %
keybd_event VK_O, 0, KEYEVENTF_KEYUP, 0 ' release O

la feuille "Ouvrir" de Windows s'affiche avec "htm.tdytest.htm" (au lieu de
htm.tdy) dans sa TextBox.
Et si l'on clique son bouton 'Ouvrir', windows dit que ce fichier n'existe
pas !

Je suis donc condamné à n'écrire que :
SendKeys "L", True ' Appelle Load
SendKeys "htm.tdy", True
' Met le focus sur Ouvre :
keybd_event VK_%, 0, KEYEVENTF_KEYUP, 0 ' release %
keybd_event VK_O, 0, KEYEVENTF_KEYUP, 0 ' release O
ce qui affiche la feuille "Ouvrir" avec le fichier 'htm.tdy' dans sa
TextBox. Mais mon utilisateur devra cliquer sur son bouton 'Ouvre', puis sur
d'autres boutons de HTMLTrim ... pour arriver à tester 'test.htm' : C'est la
m... !

En conclusion VB est incapable de traiter des SendKeys correctement.
Et donc il lui est impossible de diriger une appli extérieure.
:-( :-(

Yves Boyer yboyer@tiscali.ch

4 réponses

Avatar
Zoury
Salut Yves! :O)

je n'ai pas suivi le débat alors cette solution t'as peut-être déjà été
proposé, mais as-tu essayé d'appeler DoEvents entre chaque envoi de touche ?

--
Cordialement
Yanick Lefebvre - MVP pour Visual Basic
Le français se refait une beauté, parlons en :
http://www.orthographe-recommandee.info/
Avatar
ng
Salut,

C'est normal que le comportement soit incoorect tout ce que tu fais c'est
des releases (des key up) il faut presser la touche avant de pouvoir la
relacher !!!

Exemple :

Call keybd_event(VK_H, 0, 0, 0) '//On presse H
Call keybd_event(VK_H, 0, KEYEVENTF_KEYUP, 0) '//On relache H

De plus cela m'étonnerai qu'il existe une constante nommée VK_% ! Il faut
définir les constantes à utiliser avant.

Exemple :
Const VK_A = 65 '//cad asc("A")

Ou utliser directement Asc() :

Call keybd_event(Asc("A"), 0, 0, 0) '//On presse A
Call keybd_event(Asc("A"), 0, KEYEVENTF_KEYUP, 0) '//On relache A

On pourrait ainsi ecrire une fonction :

Option Explicit

Private Declare Sub keybd_event Lib "user32.dll" (ByVal bVk As Byte, ByVal
bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)

Private Const KEYEVENTF_KEYUP = &H2

Public Sub SendKeysAPI(strKeys As String)
Dim i As Integer, lChar As Long
For i = 1 To Len(strKeys)
lChar = Asc(Mid$(strKeys, i, 1))
Call keybd_event(lChar, 0, 0, 0)
Call keybd_event(lChar, 0, KEYEVENTF_KEYUP, 0)
Next
End Sub

Private Sub Text1_Click()
Call SendKeysAPI("SALUT")
End Sub


(c'est juste un exemple, ce n'est pas aussi complet que SendKeys())

--
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/


Yves Boyer wrote:
<Essaye l'API keyb_event :>

Merci, mais ça ne donne rien de bon.
En fait il est impossible d'enchaîner des SendKeys (ou des
keybd_event) car VB mélange tout. Si j'écris :

prog = "C:Program FilesTidyhtmlTrimHTMLTrim.exe"
htmVal = Shell(prog, 1)
AppActivate htmVal
ChDir "C:TidyAZ"

SendKeys "L", True ' Appelle Load
SendKeys "htm.tdy", True
' Met le focus sur Ouvre :
keybd_event VK_%, 0, KEYEVENTF_KEYUP, 0 ' release %
keybd_event VK_O, 0, KEYEVENTF_KEYUP, 0 ' release O
' Met le focus sur Add
keybd_event VK_%, 0, KEYEVENTF_KEYUP, 0 ' release %
keybd_event VK_A, 0, KEYEVENTF_KEYUP, 0 ' release A
SendKeys "test.htm", True
keybd_event VK_%, 0, KEYEVENTF_KEYUP, 0 ' release %
keybd_event VK_O, 0, KEYEVENTF_KEYUP, 0 ' release O

la feuille "Ouvrir" de Windows s'affiche avec "htm.tdytest.htm" (au
lieu de htm.tdy) dans sa TextBox.
Et si l'on clique son bouton 'Ouvrir', windows dit que ce fichier
n'existe pas !

Je suis donc condamné à n'écrire que :
SendKeys "L", True ' Appelle Load
SendKeys "htm.tdy", True
' Met le focus sur Ouvre :
keybd_event VK_%, 0, KEYEVENTF_KEYUP, 0 ' release %
keybd_event VK_O, 0, KEYEVENTF_KEYUP, 0 ' release O
ce qui affiche la feuille "Ouvrir" avec le fichier 'htm.tdy' dans sa
TextBox. Mais mon utilisateur devra cliquer sur son bouton 'Ouvre',
puis sur d'autres boutons de HTMLTrim ... pour arriver à tester
'test.htm' : C'est la m... !

En conclusion VB est incapable de traiter des SendKeys correctement.
Et donc il lui est impossible de diriger une appli extérieure.
:-( :-(

Yves Boyer


Avatar
François Picalausa
Hello,

Ou utliser directement Asc() :



Les codes de touches ne correspondent pas forcément!
Il existe d'ailleurs la fonction VkKeyScan(Ex) pour traduire un caractère en
la touche correspondante, il ne faut pas supposer que le code de touche est
toujours égal à Asc(xyz)
(pour info : ToUnicode est la fonction qui traduit un virtual key code en
caractère)

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

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

Je sais, d'où ma note "(c'est juste un exemple, ce n'est pas aussi complet
que SendKeys())" et l'utilisation de majuscule uniquement, je ne me
souvenais plus du nom de VkKeyScan() & co.

--
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/


François Picalausa wrote:
Hello,

Ou utliser directement Asc() :



Les codes de touches ne correspondent pas forcément!
Il existe d'ailleurs la fonction VkKeyScan(Ex) pour traduire un
caractère en la touche correspondante, il ne faut pas supposer que le
code de touche est toujours égal à Asc(xyz)
(pour info : ToUnicode est la fonction qui traduit un virtual key
code en caractère)