2009-06-10 8 views
0

Mon employeur a acheté un outil tiers, OfficeConverter de Conveter Technology, qui automatise la conversion/réparation des fichiers au format Office 2007 au format Office 2003. Cet outil automatise également la traduction/modification des exigences de code macro/VBA entre les formats Office 2003 et 2007. Mon problème est que pendant cette conversion, l'outil ouvre le produit Office ciblé, disons Excel, puis ouvre le fichier utilisateur cible (par exemple, Report.xls) et examine ensuite tout code VBA/macro pour les besoins de modifications. Le problème est que SI le code du fichier Excel dépend d'un outil externe comme un fichier .OCX et si cet outil n'existe pas sur le PC sur lequel j'effectue cette action, Excel affichera un message que l'objet a pas été trouvé, l'arrêt de l'ensemble du processus de conversion (des milliers de fichiers d'affilée) jusqu'à ce que quelqu'un arrive et clique MANUELLEMENT sur le bouton approprié pour fermer la boîte de dialogue. Je pensais que créer une petite application de surveillance en VB6 (hé, je suis vieux et mes compétences le sont aussi) pourrait s'asseoir sur le même PC et regarder pour ces boîtes de dialogue et, selon le message spécifique, cliquez sur le approprié bouton via l'appel de l'API SendMessage. Le problème est que je n'ai pas réussi à obtenir SendMessage pour PUSH le bouton pour moi, j'ai essayé de lui envoyer la valeur de la clé de retour (vbKeyReturn) ou même la touche Espace (vbKeySpace) mais l'action jamais aboutit à la fermeture de la boîte de dialogue comme il se doit. Je peux mettre l'accent sur l'onglet entre les boutons de la boîte de dialogue sont activés, mais c'est à peu près tout.Comment envoyer des clics ou des clés d'une application VB6 à une boîte de dialogue Excel?

J'ai essayé d'utiliser SendKeys, mais c'est beaucoup moins fiable et fortement déconseillé dans la documentation actuelle que j'ai trouvée.

Des suggestions? :)

+0

Avez-vous essayé d'envoyer Escape? – stuartd

Répondre

4

Si vous avez le hWnd pour le bouton et que la machine est sans surveillance, vous pouvez facilement utiliser MouseEvent pour déplacer le curseur sur le bouton et cliquer dessus. Cet échantillon comprend un module prêt drop-in qui va faire le sale boulot pour vous donné juste la poignée de fenêtre:

http://vb.mvps.org/samples/MouseEvent

Sinon, la façon la plus simple est probablement juste envoyer WM_LBUTTONDOWN et WM_LBUTTONUP séquentielle.

EDIT: Si vous "voulez juste le faire" prenez les conseils de Jim et essayez l'outil Window Demon de Gary Chanson.

+0

Bienvenue dans Stack Overflow! – MarkJ

+0

Merci, Mark. Beau concept qui va ici. –

+0

Karl, j'ai lu vos articles dans VBPJ pour YEARS et maintenant vous répondez à * ma * question ... Je me sens si chanceux! Je vais essayer votre suggestion. Merci de partager cela! –

2

Jetez un oeil à this utility "fenêtre Demon" Gary Chanson

Karl: la rapidité avec laquelle nous oublions nos amis!

+0

Oui, Gary a des outils vraiment sympas. Mon problème est que je recherche rarement une solution existante, quand c'est tellement plus amusant d'en créer une moi-même. Au moins pour des choses comme ça. Tu as raison. Celui-ci est idéal pour ce problème! –

+0

Le lien vers le fichier .zip dans l'article est mort. J'ai envoyé une note au contact du site source pour voir si le produit existe toujours. Il semble avoir été retiré de la zone bêta du site. –

1

Je suggère de jeter un oeil à AutoIt.

Il est parfait pour cette tâche, recherchez une fenêtre avec un texte particulier dessus et cliquez sur un bouton. Fonctionne dans la zone de notification en tant qu'application autonome.

+0

Cool! Merci ben! Je n'ai pas la tête de ça ... Je vais essayer. –