Как я могу отправить клики или ключи из приложения VB6 в диалоговое окно Excel? - PullRequest
0 голосов
/ 11 июня 2009

Мой работодатель приобрел стороннее средство OfficeConverter от Conveter Technology, которое автоматизирует преобразование / восстановление файлов в формате Office 2003 в формат Office 2007. Этот инструмент также позволяет автоматизировать перевод / изменение требований к коду макросов / VBA между форматами Office 2003 и 2007.

Моя проблема заключается в том, что во время этого преобразования инструмент открывает целевой продукт Office, скажем, Excel, а затем открывает целевой файл пользователя (т. Е. Report.xls) и затем проверяет любой код VBA / макроса на предмет требований к изменениям. Проблема заключается в том, что ЕСЛИ код файла Excel зависит от какого-либо внешнего инструмента, такого как файл .OCX, и если этого инструмента нет на ПК, на котором я выполняю это действие, в Excel появится сообщение о том, что объект имеет не был найден, останавливая весь процесс конвертации (тысячи файлов подряд), пока кто-то не придет и ВРУЧНУЮ не нажмет соответствующую кнопку, чтобы закрыть диалоговое окно.

Я подумал, что создание небольшого приложения для просмотра в VB6 (эй, я стар и мои навыки тоже) может сидеть на одном компьютере и наблюдать за этими диалоговыми окнами и, в зависимости от конкретного сообщения, нажимать соответствующую кнопку через вызов API SendMessage.

Проблема в том, что я не смог заставить SendMessage фактически нажать кнопку для меня, я пытался отправить ему значение ключа возврата (vbKeyReturn) или даже клавишу пробела (vbKeySpace), но действие никогда не приводит в диалоговом окне закрывается как надо. Я могу сфокусироваться на вкладке между любыми кнопками в диалоговом окне, но это все.

Я пытался использовать SendKeys, но это гораздо менее надежно и настоятельно не рекомендуется в текущей документации, с которой я столкнулся.

Есть предложения? :)

Ответы [ 3 ]

4 голосов
/ 11 июня 2009

Если у вас есть hWnd для кнопки, и машина находится без присмотра, вы можете легко использовать MouseEvent, чтобы навести курсор на кнопку и щелкнуть по ней. Этот пример включает готовый модуль, который сделает всю грязную работу за вас, используя только дескриптор окна:

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

В противном случае, самый простой способ, вероятно, просто отправить WM_LBUTTONDOWN и WM_LBUTTONUP последовательно.

РЕДАКТИРОВАТЬ: Если вы «просто хотите сделать это», примите совет Джима и попробуйте инструмент Гэри Шансона Window Demon .

2 голосов
/ 11 июня 2009

Взгляните на эту утилиту"Window Demon" от Gary Chanson

Карл: как быстро мы забываем наших приятелей!

1 голос
/ 12 июня 2009

Я бы посоветовал взглянуть на AutoIt .

Это идеально подходит для этой задачи, найдите окно с определенным текстом на нем и нажмите кнопку. Запускается в системном трее как отдельное приложение.

...