Раздел форума:
Вот я программно формирую csv-файл и программно открываю его. Обычно за дело берётся Эксел, программа работает дальше. Вопрос: как из программы мне узнать, что Эксел, запустившись, открыл файл и ждёт действий пользователя?
Вот я программно формирую csv-файл и программно открываю его. Обычно за дело берётся Эксел, программа работает дальше. Вопрос: как из программы мне узнать, что Эксел, запустившись, открыл файл и ждёт действий пользователя?
Может, прочитать заголовок окна экселя?
Хм. А и то. Попробую, спасибо. Ещё у кого есть идеи?
Может быть проблема с нелицензионным экселем, который выдаст окно с просьбой зарегистрироваться .
Не оно?
http://wladm.narod.ru/Borland/excel.html
Ну, или через COM (Component Object Model), что там нынче моднее/лучше.
2al -- Не прокатило. Эксел создаёт рабочее окно раньше, чем оно активируется.
2Savely -- Увы, не оно. Всё это я уже давным-давно проходил.
https://msdn.microsoft.com/ru-ru/library/system.windows.forms.visualstyles.visualstyleelement.window.caption.inactive(v=vs.110).aspx ?
> 2Savely -- Увы, не оно. Всё это я уже давным-давно проходил.
Хм, а запустить поток, который будет таким образом (OLE/COM) читать содержимое ячейки 0:0 до success?
Ну, я просто сходу не нашел события (или еще какой сущности), на которой можно просто подождать. Но теоретически должно что-то такое быть.
Я реально это не проходил, ибо я меньше "и швец, и жнец", чем ты.
У меня максимум - чье-то приложение регистрирует call-back функцию в моей DLL. А при регистрации DLL создает ивент, сдает его хэндл драйверу, у драйвера там список этих ивентов, которые он по прерыванию от железки с определенными флагами в регистрах железки дергает и т.д., и т.п.
2Savely
Придя домой вчера, я именно так и сделал. Обнаружив активное окно с запущенным Экселом, я запускал отдельный поток внутри приложения, который, выждав, сколько задам, терминировался на коллбэк-функцию, нажимающую кнопку. Не прокатило. Кнопка нажимается, но запущенный Экселл не обнаруживается. Погуглив, открыл, что проблема не только у меня. Сегодня попробую запускать не отдельный поток, а внешний процесс.
Ну мляааа...
Видимо, нажатие кнопки мышью каким-то образом регистрирует Эксел в диспетчере оле-объектов, а программное нажатие обходит эту регистрацию. Сегодня исследую, верна ли моя догадка.
Воистину Венда преисполнена тайн.
:) Я для подобных целей пользуюсь винбатчем. Могу нарисовать экзешник, который будет перемещать мыша и нажимать кнопку. Он с виндой работает адекватно.
Вроде: нажать кнопку пуска, два раза вниз и пуск программы из иконки.
Если на ВижуалБацике, то гуглится какое-то там решение. В Java проверить, открыт ли файл, вообще, тьфу. Недоступен - ловим исключение. Точнее, получается, открыть можно но запись не разрешена (значит, кто-то уже открыл). Что там внутри у этих библиотек - я не знаю. Какой-то API с Вендой.
Но как вы будете "от нуля" это делать, по своему - тут не знаю... Либу придумаете на С++? Но вы то ещё и не такое сможете, конечно, вы спец. Но лучше, конечно, что-то готовое съюзать.
Петро, внмательнее читай. Я проверяю, что файл открыт Экселом. Я писал об этом выше. Теперь задача: обнаружить ЭТО ЖЕ средствами оле-автоматизации и далее программно подредактировать открытый файл. Для этого я написал функцию. И поставил на экран кнопку, по событию нажатия на которую функция вызывается. Если событие генерирую программно, Эксел, как оле-объект, не обнаруживается. Если жму мышью -- обнаруживается, и всё работает. ПОЧЕМУ -- вот в чём вопрос.
А через WSH никак?
Зачем WSH? Вынес программное доредактирование открытого в Экселе файла в отдельное консольное приложение 0,023 Мбайта, запускаю его в своей софтине через
ShellExecute(0, 0, "Press.exe", 0, 0, SW_SHOWNORMAL);// доредактирование
и всё работает. Ну мерцнёт на экране консоль и тут же исчезнет -- юзер cтерпит. Лишь бы заплатил. :) Проблема, конечно, осталась: не объяснено поведение Венды. Венда -- та ещё "вещь в себе". Что хрюха, что десятка.
Всем спасибо.