VBA et le sendkeys au dos

[Fermé]
Signaler
Messages postés
128
Date d'inscription
lundi 12 janvier 2004
Statut
Membre
Dernière intervention
19 février 2008
-
 Stephane022 -
Bonsoir à l'ensemble des ecteurs de ce post.

Je vais essayer d'être clair et concis, mais étant donné mes faibles compétences en programation, veuillez être indulgent, je suis chimiste au départ ;-)!

Bon alors j'essaye de faire un programme en VBA pour remonter sur un automate relativement vieux. Cet appareil communique avec mon pc via un port série sous protocole RS232.
Il éxiste un programme d'acquisition des données en dos.

Le but est donc de réaliser une communication entre l'automate et l'appareil. Pour ce faire l'analyse a montrer qu'il faut passer par une base de donnée sql via in touch.
Or pour renseigner cette base de donnée, il faut pouvoir faire communiquer le programme en dos avec sql.
On a donc décider de passer par VBA.

La partie travaille des données une fois importées dans sql ne pose pas de problème.
L'ouverture du fichier dos non plus via la commande shell.
En revanche là où il y a soucis c'est pour émmuler la saisi de touches clavier une fois le programme dos ouvert.
J'arrive à prendre la mian sur le prog via appactivate, mais mes tentatives d'émulation clavier via sendkeys ou keybd_event ne marchent pas.

Il s'vère que ces fonction marchent plutôt bien pour des logiciels en environnement windows mais pas en environnement dos.

Donc si qu'elqu'un à une idée de commande ou de moyen détourner pour envoyer des touches au programme dos ce serait sympa d'éclairer ma lanterne de désepéré.
Quitte à m'expliquer comment faire cette partie dans un autre langage de prog et àle compiler puis le lancer depuis vba.

Mille merci d'avance et c'est sympa de m'avoir lu

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
3
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 65492 internautes nous ont dit merci ce mois-ci

Messages postés
128
Date d'inscription
lundi 12 janvier 2004
Statut
Membre
Dernière intervention
19 février 2008
9
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!
Messages postés
128
Date d'inscription
lundi 12 janvier 2004
Statut
Membre
Dernière intervention
19 février 2008
9
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
Messages postés
387
Date d'inscription
jeudi 23 octobre 2003
Statut
Contributeur
Dernière intervention
12 avril 2007
112
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°~
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
Messages postés
128
Date d'inscription
lundi 12 janvier 2004
Statut
Membre
Dernière intervention
19 février 2008
9
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.
re :

est-ce possible de connaître le langage du programme DOS ?

est-ce un fichier en lot (batch file), un fichier compiler (*.exe) ?

Lupin
Messages postés
128
Date d'inscription
lundi 12 janvier 2004
Statut
Membre
Dernière intervention
19 février 2008
9
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!

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
Messages postés
128
Date d'inscription
lundi 12 janvier 2004
Statut
Membre
Dernière intervention
19 février 2008
9
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.
Messages postés
6
Date d'inscription
jeudi 10 juillet 2003
Statut
Membre
Dernière intervention
14 janvier 2007

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+
Messages postés
6
Date d'inscription
jeudi 10 juillet 2003
Statut
Membre
Dernière intervention
14 janvier 2007

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)
Messages postés
6
Date d'inscription
jeudi 10 juillet 2003
Statut
Membre
Dernière intervention
14 janvier 2007

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