Как из программы узнать, что Эксел, запустившись, открыл файл и ждёт действий пользователя

Раздел форума: 

Аватар пользователя mike

Вот я программно формирую csv-файл и программно открываю его. Обычно за дело берётся Эксел, программа работает дальше. Вопрос: как из программы мне узнать, что Эксел, запустившись, открыл файл и ждёт действий пользователя?

Аватар пользователя Al

Может, прочитать заголовок окна экселя?

Аватар пользователя mike

...Прочитать заголовок окна экселя?

Хм. А и то. Попробую, спасибо. Ещё у кого есть идеи?

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

Аватар пользователя savely

Не оно? 

http://wladm.narod.ru/Borland/excel.html

Ну, или через COM (Component Object Model), что там нынче моднее/лучше. 

Аватар пользователя mike

2al -- Не прокатило. Эксел создаёт рабочее окно раньше, чем оно активируется.

2Savely -- Увы, не оно. Всё это я уже давным-давно проходил.

Аватар пользователя savely

2Savely -- Увы, не оно. Всё это я уже давным-давно проходил.

Хм, а запустить поток, который будет таким образом (OLE/COM) читать содержимое ячейки 0:0 до success? 

Ну, я просто сходу не нашел события (или еще какой сущности), на которой можно просто подождать. Но теоретически должно что-то такое быть.

Я реально это не проходил, ибо я меньше "и швец, и жнец", чем ты.

У меня максимум - чье-то приложение регистрирует call-back функцию в моей DLL. А при регистрации DLL создает ивент, сдает его хэндл драйверу, у драйвера там список этих ивентов, которые он по прерыванию от железки с определенными флагами в регистрах железки дергает и т.д., и т.п.

Аватар пользователя mike

2Savely

Придя домой вчера, я именно так и сделал. Обнаружив активное окно с запущенным Экселом, я запускал отдельный поток внутри приложения, который, выждав, сколько задам, терминировался на коллбэк-функцию, нажимающую кнопку. Не прокатило. Кнопка нажимается, но запущенный Экселл не обнаруживается. Погуглив, открыл, что проблема не только у меня. Сегодня попробую запускать не отдельный поток, а внешний процесс.

Ну мляааа...

Видимо, нажатие кнопки мышью каким-то образом регистрирует Эксел в диспетчере оле-объектов, а программное нажатие обходит эту регистрацию. Сегодня исследую, верна ли моя догадка.

Воистину Венда преисполнена тайн. 

:) Я для подобных целей пользуюсь винбатчем. Могу нарисовать экзешник, который будет перемещать мыша и нажимать кнопку. Он с виндой работает адекватно.

Вроде: нажать кнопку пуска, два раза вниз и пуск программы из иконки.

Аватар пользователя Petro46

Если на ВижуалБацике, то гуглится какое-то там решение. В Java проверить, открыт ли файл, вообще, тьфу. Недоступен - ловим исключение. Точнее, получается, открыть можно но запись не разрешена (значит, кто-то уже открыл). Что там внутри у этих библиотек - я не знаю. Какой-то API с Вендой.

Но как вы будете "от нуля" это делать, по своему - тут не знаю... Либу придумаете на С++? Но вы то ещё и не такое сможете, конечно, вы спец. Но лучше, конечно, что-то готовое съюзать.

Аватар пользователя mike

Петро, внмательнее читай. Я проверяю, что файл открыт Экселом. Я писал об этом выше. Теперь задача: обнаружить ЭТО ЖЕ средствами оле-автоматизации и далее программно подредактировать открытый файл. Для этого я написал функцию. И поставил на экран кнопку, по событию нажатия на которую функция вызывается. Если событие генерирую программно, Эксел, как оле-объект, не обнаруживается. Если жму мышью -- обнаруживается, и всё работает. ПОЧЕМУ -- вот в чём вопрос.

Аватар пользователя Al

А через WSH никак?

Аватар пользователя mike

Зачем WSH? Вынес программное доредактирование открытого в Экселе файла в отдельное консольное приложение 0,023 Мбайта, запускаю его в своей софтине через

ShellExecute(0, 0, "Press.exe", 0, 0, SW_SHOWNORMAL);// доредактирование

и всё работает. Ну мерцнёт на экране консоль и тут же исчезнет -- юзер cтерпит. Лишь бы заплатил. :) Проблема, конечно, осталась: не объяснено поведение Венды. Венда -- та ещё "вещь в себе". Что хрюха, что десятка.

Всем спасибо.

Добавить комментарий