VBA et le sendkeys au dos
Fermé
dimibodts
Messages postés
129
Date d'inscription
lundi 12 janvier 2004
Statut
Membre
Dernière intervention
19 février 2008
-
19 août 2004 à 18:39
Stephane022 - 15 août 2008 à 17:55
Stephane022 - 15 août 2008 à 17:55
12 réponses
Salut,
Pour passer des touches dans une fenêtre Dos moi j'ai utilisé le logiciel BillRedirect. C'est un logiciel qui se spécialise dans la redirection des données va voir ... www.BillProduction.com
Bonne chance ...
Steph
Pour passer des touches dans une fenêtre Dos moi j'ai utilisé le logiciel BillRedirect. C'est un logiciel qui se spécialise dans la redirection des données va voir ... www.BillProduction.com
Bonne chance ...
Steph
dimibodts
Messages postés
129
Date d'inscription
lundi 12 janvier 2004
Statut
Membre
Dernière intervention
19 février 2008
9
19 août 2004 à 23:21
19 août 2004 à 23:21
ARf bonne question!
Je tablerai pour un fichier comiler en .exe, donc il est pas évident de connaître le langage dans lequel il est porgrammé.
Je ne sais si je suis très clair!
En tout cas merci de s'intéresser à mon problème!
Je tablerai pour un fichier comiler en .exe, donc il est pas évident de connaître le langage dans lequel il est porgrammé.
Je ne sais si je suis très clair!
En tout cas merci de s'intéresser à mon problème!
dimibodts
Messages postés
129
Date d'inscription
lundi 12 janvier 2004
Statut
Membre
Dernière intervention
19 février 2008
9
24 août 2004 à 00:45
24 août 2004 à 00:45
Merci Luckymonaco de t'intéresser à moi et de me proposer cette solution, malheureusement, j'avais déja envisager keydb_event!
Néanmoins peut-être est-ce une erreur de synthaxe de ma part, étant un parfait débutant (1 semaine de porgrammation à tout casser), ce serait très probable.
Voile le programme tel qu'il est avec les deux fonctions d'emmulation calvier:
Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Declare Sub keybd_event Lib "user32" Alias "keybd_event" ( _
ByVal bVk As Byte, _
ByVal bScan As Byte, _
ByVal dwFlags As Long, _
ByVal dwExtraInfo As Long)
Sub rappatriement()
Dim I As Long
I = Shell ("c:\WINNT\bureau\RS232\T.exe")
' ouverture du prog en Dos
AppActivate I
' Prise de main sur le prog en DOS
Sleep 5000
' attente d'éxécution
SendKeys ({F2})
' emmule F2 sur le programme qui a la main, lance le prog
Sleep 2000
SendKeys (A)
' nom du fichier texte généré par le prog en dos
Sleep 500
SendKeys (~)
' validation du nom
' emmule entré
Sleep 120000
SendKeys ({F3})
' emmule F3 arrêt du prog
Sleep 1000
SendKeys ({esc})
' emmule echap, termine le prog DOS
End Sub
Sub Rappatriement2()
Dim I As Long
Const VK_démarre = 71
Const VK_arrete = 72
Const VK_termine = 1B
Const VK_nom = 41
'Const VK_ok = 'ba la comme ça je me rappelle plus du code ascii correspondant à entree
I = Shell ("c:\WINNT\bureau\RS232\T.exe")
' ouverture du prog en Dos
AppActivate (I)
' Prise de main sur le prog en DOS
Sleep 5000
' attente d'éxécution
Call keybd_event(Vk_démmarre, 0, 0, 0)
' emmule F2 sur le programme qui a la main, lance le prog
Sleep 2000
Call keybd_event(Vk_nom, 0, 0, 0)
' nom du fichier texte généré par le prog en dos
Sleep 500
Call keybd_event(Vk_ok, 0, 0, 0)
' validation du nom
' emmule entré
Sleep 120000
Call keydb_event(Vk_arrete, 0, 0, 0)
' emmule F3 arrêt du prog
Sleep 1000
Call keydb_event(Vk_termine, 0, 0, 0)
' emmule echap, termine le prog DOS
end sub
Donc voila, si vous voyez une grossière erreur, merci de me faire signe.
Très cordialement
Dimi
Néanmoins peut-être est-ce une erreur de synthaxe de ma part, étant un parfait débutant (1 semaine de porgrammation à tout casser), ce serait très probable.
Voile le programme tel qu'il est avec les deux fonctions d'emmulation calvier:
Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Declare Sub keybd_event Lib "user32" Alias "keybd_event" ( _
ByVal bVk As Byte, _
ByVal bScan As Byte, _
ByVal dwFlags As Long, _
ByVal dwExtraInfo As Long)
Sub rappatriement()
Dim I As Long
I = Shell ("c:\WINNT\bureau\RS232\T.exe")
' ouverture du prog en Dos
AppActivate I
' Prise de main sur le prog en DOS
Sleep 5000
' attente d'éxécution
SendKeys ({F2})
' emmule F2 sur le programme qui a la main, lance le prog
Sleep 2000
SendKeys (A)
' nom du fichier texte généré par le prog en dos
Sleep 500
SendKeys (~)
' validation du nom
' emmule entré
Sleep 120000
SendKeys ({F3})
' emmule F3 arrêt du prog
Sleep 1000
SendKeys ({esc})
' emmule echap, termine le prog DOS
End Sub
Sub Rappatriement2()
Dim I As Long
Const VK_démarre = 71
Const VK_arrete = 72
Const VK_termine = 1B
Const VK_nom = 41
'Const VK_ok = 'ba la comme ça je me rappelle plus du code ascii correspondant à entree
I = Shell ("c:\WINNT\bureau\RS232\T.exe")
' ouverture du prog en Dos
AppActivate (I)
' Prise de main sur le prog en DOS
Sleep 5000
' attente d'éxécution
Call keybd_event(Vk_démmarre, 0, 0, 0)
' emmule F2 sur le programme qui a la main, lance le prog
Sleep 2000
Call keybd_event(Vk_nom, 0, 0, 0)
' nom du fichier texte généré par le prog en dos
Sleep 500
Call keybd_event(Vk_ok, 0, 0, 0)
' validation du nom
' emmule entré
Sleep 120000
Call keydb_event(Vk_arrete, 0, 0, 0)
' emmule F3 arrêt du prog
Sleep 1000
Call keydb_event(Vk_termine, 0, 0, 0)
' emmule echap, termine le prog DOS
end sub
Donc voila, si vous voyez une grossière erreur, merci de me faire signe.
Très cordialement
Dimi
sidarus
Messages postés
387
Date d'inscription
jeudi 23 octobre 2003
Statut
Contributeur
Dernière intervention
12 avril 2007
112
19 août 2004 à 19:47
19 août 2004 à 19:47
J'ai beau relire mais il me manque des éléments/précisions...
Peux-tu etre plus exaustif stp. Enfin détail-nous l'objectif, le materiel et méthodes retenues pour atteindre l'objectif. @+
~°sidarus°~
Peux-tu etre plus exaustif stp. Enfin détail-nous l'objectif, le materiel et méthodes retenues pour atteindre l'objectif. @+
~°sidarus°~
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Bonjour,
Puisque que vous avez commencer avec VBA, je vous conseille d'utiliser VBS (un sous-ensemble) qui s'insère très bien sous VBA et vous permettra d'effectuer tous les opérations requises en mode DOS.
Enfin, c'est un avis !
Lupin
Puisque que vous avez commencer avec VBA, je vous conseille d'utiliser VBS (un sous-ensemble) qui s'insère très bien sous VBA et vous permettra d'effectuer tous les opérations requises en mode DOS.
Enfin, c'est un avis !
Lupin
dimibodts
Messages postés
129
Date d'inscription
lundi 12 janvier 2004
Statut
Membre
Dernière intervention
19 février 2008
9
19 août 2004 à 20:38
19 août 2004 à 20:38
Merci de votre réponse, je vais tenter d'être plus compréhensible.
NB: ce post aurait dû figurer dans la rubrique programmation mais je me suis tromper!
Mon appareil communique déja avec mon pc via le port série et le protocole RS 232. Cette communication est assurée par le biais d'un programme qui s'éxécute dans une fenêtre DOS. Le programme lorsqu'il aprt en lecture peut acquérir les données dans un fichier texte avec séparateurs. Moi j'arrive sans problème à exploiter ce fichier texte et faire tout ce que je veux avec. En revanche, pour que ce fichier texte soit généré, je dois activer mon programme en dos et lui donner des isntructions.
Dorénavent le but est donc de parvenir à ouvrir le programe dos en question et lui faire lancer l'acquisition des données auromatiquement. Pour l'ouvrir je fais appel à la comamnde shell.
Ensuite il me faut signifier au programme qu'il doit démarrer l'acquisition des données dans un fichier texte spécifié son nom et enfin arrêter le programme.
Ensuite il me faut donc émmuler une saisie clavier sur ce programme dos des touches F2(démarrage), A (pour le nom de mon fichier texte) entrée(pour le valider), F3(pour arrêter le prog) et esc (pour terminer le prog).
Donc le problème c'est q'uen VBA la fonction sendkeys et la fonction keybd_event qui sont sensé immulé l'appuie sur une touche en directin d'un programme ne marche d'une part que pour les programmes qui ont la main (on peut l'obtenir avec la fonction applactivate) et avec les programmes souwindows donc pas les programmes en dos comme le mien.
La question est donc sacahnt cela, une âme généreuse et créative aurait-elle une idée de fonction pouva&nt faire l'affaire n VBA ou à défaut une solution dans un autre langage de programmation, sachant que pour ainsi dire, je n'en maitrise aucun.
NB: ce post aurait dû figurer dans la rubrique programmation mais je me suis tromper!
Mon appareil communique déja avec mon pc via le port série et le protocole RS 232. Cette communication est assurée par le biais d'un programme qui s'éxécute dans une fenêtre DOS. Le programme lorsqu'il aprt en lecture peut acquérir les données dans un fichier texte avec séparateurs. Moi j'arrive sans problème à exploiter ce fichier texte et faire tout ce que je veux avec. En revanche, pour que ce fichier texte soit généré, je dois activer mon programme en dos et lui donner des isntructions.
Dorénavent le but est donc de parvenir à ouvrir le programe dos en question et lui faire lancer l'acquisition des données auromatiquement. Pour l'ouvrir je fais appel à la comamnde shell.
Ensuite il me faut signifier au programme qu'il doit démarrer l'acquisition des données dans un fichier texte spécifié son nom et enfin arrêter le programme.
Ensuite il me faut donc émmuler une saisie clavier sur ce programme dos des touches F2(démarrage), A (pour le nom de mon fichier texte) entrée(pour le valider), F3(pour arrêter le prog) et esc (pour terminer le prog).
Donc le problème c'est q'uen VBA la fonction sendkeys et la fonction keybd_event qui sont sensé immulé l'appuie sur une touche en directin d'un programme ne marche d'une part que pour les programmes qui ont la main (on peut l'obtenir avec la fonction applactivate) et avec les programmes souwindows donc pas les programmes en dos comme le mien.
La question est donc sacahnt cela, une âme généreuse et créative aurait-elle une idée de fonction pouva&nt faire l'affaire n VBA ou à défaut une solution dans un autre langage de programmation, sachant que pour ainsi dire, je n'en maitrise aucun.
dimibodts
Messages postés
129
Date d'inscription
lundi 12 janvier 2004
Statut
Membre
Dernière intervention
19 février 2008
9
19 août 2004 à 22:37
19 août 2004 à 22:37
ARf bonne question!
Je tablerai pour un fichier comiler en .exe, donc il est pas évident de connaître le langage dans lequel il est porgrammé.
Je ne sais si je suis très clair!
En tout cas merci de s'intéresser à mon problème!
Je tablerai pour un fichier comiler en .exe, donc il est pas évident de connaître le langage dans lequel il est porgrammé.
Je ne sais si je suis très clair!
En tout cas merci de s'intéresser à mon problème!
Utilisateur anonyme
20 août 2004 à 16:12
20 août 2004 à 16:12
Bonjour,
Ouf ! Un logiciel compiler, il n'y a pas grand chose à faire de ce côté. Je crois bien que je pencherais encore pour le vbscript, celui-ci pouvant être exécuter en mode console (DOS), il est possible de monitorer cette application. Toutefois, la démarche est relativement complexe. Le site de microsoft "Script Center" devrait vous permettre de trouver les objets à inclure sous VBA pour exécuter et monitorer une application DOS.
http://www.microsoft.com/technet/community/scriptcenter/default.mspx
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/script56/html/wsmthregread.asp
Ça ne vous aideras peut-être pas mais enfin, c'est une opinion.
Lupin
Ouf ! Un logiciel compiler, il n'y a pas grand chose à faire de ce côté. Je crois bien que je pencherais encore pour le vbscript, celui-ci pouvant être exécuter en mode console (DOS), il est possible de monitorer cette application. Toutefois, la démarche est relativement complexe. Le site de microsoft "Script Center" devrait vous permettre de trouver les objets à inclure sous VBA pour exécuter et monitorer une application DOS.
http://www.microsoft.com/technet/community/scriptcenter/default.mspx
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/script56/html/wsmthregread.asp
Ça ne vous aideras peut-être pas mais enfin, c'est une opinion.
Lupin
dimibodts
Messages postés
129
Date d'inscription
lundi 12 janvier 2004
Statut
Membre
Dernière intervention
19 février 2008
9
20 août 2004 à 17:20
20 août 2004 à 17:20
Bonjour Arsène!
Ba merci pour ces raccourcis, j'ai peut-être bien trouvé mon bohneur.
Je vais potasser la focntion ce week-end et essayer de mettre en application celle-ci lundi, si le redémarrage de l'usine m'en laisse le temps.
Je vous tiens au courant.
Et encore merci.
Si une fois le script VB opérationnel vous êtes intéressé par celui-ci faites moi signe!
Merci encore.
Ba merci pour ces raccourcis, j'ai peut-être bien trouvé mon bohneur.
Je vais potasser la focntion ce week-end et essayer de mettre en application celle-ci lundi, si le redémarrage de l'usine m'en laisse le temps.
Je vous tiens au courant.
Et encore merci.
Si une fois le script VB opérationnel vous êtes intéressé par celui-ci faites moi signe!
Merci encore.
luckymonaco
Messages postés
6
Date d'inscription
jeudi 10 juillet 2003
Statut
Membre
Dernière intervention
14 janvier 2007
23 août 2004 à 21:34
23 août 2004 à 21:34
Salut a tous
je pense que la solutions est dans l'utilisation d'uneAPI, je l'ai utilisée, je la retrouve et je vous la donne
A+
je pense que la solutions est dans l'utilisation d'uneAPI, je l'ai utilisée, je la retrouve et je vous la donne
A+
luckymonaco
Messages postés
6
Date d'inscription
jeudi 10 juillet 2003
Statut
Membre
Dernière intervention
14 janvier 2007
23 août 2004 à 22:59
23 août 2004 à 22:59
Voila je l'ai retrouvé
Fonction keybd_event
Declare Sub keybd_event Lib "user32" Alias "keybd_event" ( _
ByVal bVk As Byte, _
ByVal bScan As Byte, _
ByVal dwFlags As Long, _
ByVal dwExtraInfo As Long)
Versions :
. Windows 95/98 : Oui
. Windows NT : A partir de 3.1
. Windows 2000/XP : Oui
Description :
Cette API permet de simuler des frappes au clavier tout comme vous le feriez.
bVk est le code ascii de la touche à envoyer au buffer clavier.
bScan est utilisé pour définir l'action de certaines touches spéciales comme "Imprime écran".
dwFlags est l'évènement que l'on souhaite génèrer comme KeyUp ou l'utilisation des touches étendues sur les claviers spéciaux.
dwExtraInfo permet d'ajouter une valeur supplémentaire à la touche actionnée.
Exemple d'utilisation :
' Exemple de Phil (Plancon@Onetelnet.fr)
Option Explicit
Private Declare Sub keybd_event Lib "user32" Alias "keybd_event" ( _
ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, _
ByVal dwExtraInfo As Long)
' bVk est le code ascii de la touche
Private Const VK_LWIN = &H5B
Private Const VK_APPS = &H5D
' Pour d'autres touches...
' a à z 65 à 90
' Home 36
' End 35
' Flêche vers le haut 38
' Flêche vers le bas 40
' Flêche vers la gauche 37
' Flêche vers la droite 39
' Echap 27
' Impr écran 44 (= vbKeySnapshot)
' Page haut 33
' Page bas 34
' Insert 45
' F1 à F12 112 à 123
' Barre d'espace 32
' Ctrl 17
' Alt 18
' Maj 16
' Verr Num 144
' Arrêt défil 145
' Tab 9
' Shift 16
' bscan (Lorsque l'on utilise la touche imprime écran)
Const TheScreen = 1 ' Copie l'écran
Const TheForm = 0 ' Copie la fenêtre active
' dwFlags (le drapeau) :
Const KEYEVENTF_EXTENDEDKEY = &H1 ' Pour actionner les touches étendues
Const KEYEVENTF_KEYUP = &H2 ' Relache la touche
' ---Cet exemple montre comment gérer Windows---
Sub GestionWindows(Index As Integer)
' ---déclarations des variables---
Dim VK_ACTION As Long
' ---Traite l'action---
Select Case Index
Case 0 ' Ouverture de l'Exploreur
VK_ACTION = &H45 ' La lettre e (ascii 69)
Case 1 ' Rechercher des fichiers
VK_ACTION = &H46 ' La lettre f (ascii 70)
Case 2 ' Réduire toutes les fenêtres
VK_ACTION = &H4D ' La lettre m (ascii 77)
Case 3 ' Ouverture du menu exécuter
VK_ACTION = &H52 ' La lettre r (ascii 82)
Case 4 ' Actionner le menu démarrer
VK_ACTION = &H5B ' Le bouton démarrer de windows sur le clavier (ascci 91)
End Select
' ---Envoie de la séquence de touche---
Call keybd_event(VK_LWIN, 0, 0, 0)
Call keybd_event(VK_ACTION, 0, 0, 0)
Call keybd_event(VK_LWIN, 0, KEYEVENTF_KEYUP, 0)
End Sub
Private Sub Command1_Click()
' ---Copie d'écran de la forme active (pour l'écran utiliser "TheScreen")---
keybd_event vbKeySnapshot, TheForm, 0&, 0&
' ---On laisse le temps à Windows de charger l'image en mémoire---
DoEvents
' ---Copie du presse-papier dans le contrôle image1---
Image1 = Clipboard.GetData(vbCFBitmap)
End Sub
Merci, a docvb.free.fr et a RVTT (vbfrance.com)
Fonction keybd_event
Declare Sub keybd_event Lib "user32" Alias "keybd_event" ( _
ByVal bVk As Byte, _
ByVal bScan As Byte, _
ByVal dwFlags As Long, _
ByVal dwExtraInfo As Long)
Versions :
. Windows 95/98 : Oui
. Windows NT : A partir de 3.1
. Windows 2000/XP : Oui
Description :
Cette API permet de simuler des frappes au clavier tout comme vous le feriez.
bVk est le code ascii de la touche à envoyer au buffer clavier.
bScan est utilisé pour définir l'action de certaines touches spéciales comme "Imprime écran".
dwFlags est l'évènement que l'on souhaite génèrer comme KeyUp ou l'utilisation des touches étendues sur les claviers spéciaux.
dwExtraInfo permet d'ajouter une valeur supplémentaire à la touche actionnée.
Exemple d'utilisation :
' Exemple de Phil (Plancon@Onetelnet.fr)
Option Explicit
Private Declare Sub keybd_event Lib "user32" Alias "keybd_event" ( _
ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, _
ByVal dwExtraInfo As Long)
' bVk est le code ascii de la touche
Private Const VK_LWIN = &H5B
Private Const VK_APPS = &H5D
' Pour d'autres touches...
' a à z 65 à 90
' Home 36
' End 35
' Flêche vers le haut 38
' Flêche vers le bas 40
' Flêche vers la gauche 37
' Flêche vers la droite 39
' Echap 27
' Impr écran 44 (= vbKeySnapshot)
' Page haut 33
' Page bas 34
' Insert 45
' F1 à F12 112 à 123
' Barre d'espace 32
' Ctrl 17
' Alt 18
' Maj 16
' Verr Num 144
' Arrêt défil 145
' Tab 9
' Shift 16
' bscan (Lorsque l'on utilise la touche imprime écran)
Const TheScreen = 1 ' Copie l'écran
Const TheForm = 0 ' Copie la fenêtre active
' dwFlags (le drapeau) :
Const KEYEVENTF_EXTENDEDKEY = &H1 ' Pour actionner les touches étendues
Const KEYEVENTF_KEYUP = &H2 ' Relache la touche
' ---Cet exemple montre comment gérer Windows---
Sub GestionWindows(Index As Integer)
' ---déclarations des variables---
Dim VK_ACTION As Long
' ---Traite l'action---
Select Case Index
Case 0 ' Ouverture de l'Exploreur
VK_ACTION = &H45 ' La lettre e (ascii 69)
Case 1 ' Rechercher des fichiers
VK_ACTION = &H46 ' La lettre f (ascii 70)
Case 2 ' Réduire toutes les fenêtres
VK_ACTION = &H4D ' La lettre m (ascii 77)
Case 3 ' Ouverture du menu exécuter
VK_ACTION = &H52 ' La lettre r (ascii 82)
Case 4 ' Actionner le menu démarrer
VK_ACTION = &H5B ' Le bouton démarrer de windows sur le clavier (ascci 91)
End Select
' ---Envoie de la séquence de touche---
Call keybd_event(VK_LWIN, 0, 0, 0)
Call keybd_event(VK_ACTION, 0, 0, 0)
Call keybd_event(VK_LWIN, 0, KEYEVENTF_KEYUP, 0)
End Sub
Private Sub Command1_Click()
' ---Copie d'écran de la forme active (pour l'écran utiliser "TheScreen")---
keybd_event vbKeySnapshot, TheForm, 0&, 0&
' ---On laisse le temps à Windows de charger l'image en mémoire---
DoEvents
' ---Copie du presse-papier dans le contrôle image1---
Image1 = Clipboard.GetData(vbCFBitmap)
End Sub
Merci, a docvb.free.fr et a RVTT (vbfrance.com)
luckymonaco
Messages postés
6
Date d'inscription
jeudi 10 juillet 2003
Statut
Membre
Dernière intervention
14 janvier 2007
23 août 2004 à 23:03
23 août 2004 à 23:03
j'ai lu dans votre premier msg que vous aviez utilise cette fonction, sans succés, mais je vous l'ai copier comme je l'ai eu. ces explication mon permis de piloter un automate.
a vous de voir
salut
a vous de voir
salut