Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Обнаружение и закрытие модального окна Excel
|
|||
|---|---|---|---|
|
#18+
Попал я в засаду. Есть некая приблуда. Действует так. Загружает файло собственного формата в Excel, при этом одновременно грузится куча надстроек. Теперь надо нажать кнопульку, что бы она выполнила некие действия. Выполняемый ею код находится в некой самодельной dll. После выполнения действий она радостно сообщает, что все правильно. На закрытие книгу, опять же заправшивает нестандартное подтверждение (повешено на событие закрытия формы. Кажется). Мне нужно, что бы открытие файла, его обработка и закрытия шли без участия оператора. DLL сломать я не умею :(. Так бы забил нах эти подтверждения и все. Что я смог сделать. 1. Открываю файло 2. Запускаю обработчик Теперь мне надо отловить окончание процесса обработки, появление модальной формы и ее закрытие Приближенная модель implementation {$R *.dfm} var EA : OLEVariant; Hwnd : Integer; procedure TForm1.FormCreate(Sender: TObject); begin Timer1.Enabled:=true; { запускаю таймер. В данном случае это не нужно, но в реальности надо ловить момент, когда приблуда загрузила файло } try EA:=GetActiveOleObject('Excel.Application'); except EA:=CreateOleObject('Excel.Application'); end; EA.Workbooks.Open('test.xls'); EA.visible:=true; EA.DisplayFullScreen:=True; //Не помню, как тама правильно перерисовывать область EA.DisplayFullScreen:=false; //использую этот метод end; procedure TForm1.Timer1Timer(Sender: TObject); begin try //Жду, пока файло откроется if pos('test',EA.ActiveWorkBook.Name)<> 0 then begin Timer1.Enabled:=false; Hwnd:=EA.Hwnd; //получаю дескриптор окна BringWindowToTop(Hwnd); EA.Run('fopen'); //иммитирую действие и открытие модального ТУТА НАДО НАЧИНАТЬ ЛОВИТЬ ОКОНЧАНИЕ ОБРАБОТКИ end; except end; end; end. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.06.2003, 20:14 |
|
||
|
Обнаружение и закрытие модального окна Excel
|
|||
|---|---|---|---|
|
#18+
Может тебе сымитировать нажатия операторами кнопок? ловить типа топ окно и если оно имеет GetWindowText тот который тебе нужен(например) то посылаеш этому окну wm_close (тоже например, не уверен что не сработает кансел какойнить). Я вообще, правильно проблему понял? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.06.2003, 21:16 |
|
||
|
Обнаружение и закрытие модального окна Excel
|
|||
|---|---|---|---|
|
#18+
alex_k. Правильно (вроде). Т.е. ты предлагаешь в цикле ловить появление окна нужным с текстом и иммитировать нажатие кнопки? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.06.2003, 22:01 |
|
||
|
Обнаружение и закрытие модального окна Excel
|
|||
|---|---|---|---|
|
#18+
Посмотрите, что эта Dll экспортирует. Если там всего 1 функция с 1 параметром (имя xls файла), то вызови из VBA. Хотя может быть, что там много функций. Одним словом, что за dll и что именно она экспортирует? Может эта dll вообще COM компонент? dumpbin /exports my.dll ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.06.2003, 22:13 |
|
||
|
Обнаружение и закрытие модального окна Excel
|
|||
|---|---|---|---|
|
#18+
Несколько функций без параметров. Насколько я понял, это действительно COM. ======== С циклом - облом ... EA.Run('fopen'); //тут моя прога останавливается, и до получения хандлера не доходит HWND:=FindWindow(lpClassName,lpWindowName); Label1.Caption:=lpClassName; Label2.Caption:=lpWindowName; Form1.Repaint; ... Моя форма ждет, пока я закрою модальну форму в экселе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.06.2003, 22:40 |
|
||
|
Обнаружение и закрытие модального окна Excel
|
|||
|---|---|---|---|
|
#18+
dumpbin /exports my.dll не проходит. Ругается, что нет mspdb60.dll. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.06.2003, 22:48 |
|
||
|
Обнаружение и закрытие модального окна Excel
|
|||
|---|---|---|---|
|
#18+
Народ, как думаете, поможет запуcкать Excel и проверку на наличие формы в разных потоках? Не помню, как потоки делаются, до завтра не разберусь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.06.2003, 22:58 |
|
||
|
Обнаружение и закрытие модального окна Excel
|
|||
|---|---|---|---|
|
#18+
Можно вызвать исключение в обработчике екселя и в дельфе отлавливать его. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.06.2003, 00:11 |
|
||
|
Обнаружение и закрытие модального окна Excel
|
|||
|---|---|---|---|
|
#18+
Код экселя мне недоступен - защита. Можно снять, но файлов - тысячи. Я как-нибудь в ПТ расскажу про эту хрень и уродов, которые это придумали ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.06.2003, 07:28 |
|
||
|
Обнаружение и закрытие модального окна Excel
|
|||
|---|---|---|---|
|
#18+
Ну че, как успехи? Я как то писал прогу которая из текстового файла в программу(пенсионка какая-то 2ндфл вроде) забивает данные о сотрудника(фио документы адреса и т.д.). Она сама мышкой водила кнопками тайпала :-) ниче там несколько сотен записей так я программу быстрее написал нежели бы кто-то руками забивал :-) в потоках я думаю можно а можно вообще отдельный процесс юзать. типа отдельную программу ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2003, 18:53 |
|
||
|
Обнаружение и закрытие модального окна Excel
|
|||
|---|---|---|---|
|
#18+
Ноль. Коллективно сделали из макросом из Accessa, типа он сам асинхронные потоки создает, но время задержки подбирается экспериментально для каждого компа. Правда, хоть оператору не надо торкаться. ============== Но я не сдаюсь. Я это уделаю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2003, 19:28 |
|
||
|
Обнаружение и закрытие модального окна Excel
|
|||
|---|---|---|---|
|
#18+
У меня есть функция которая запускает чтото и ждет его закрытия. Тебе можно прикрутить так: прога запускает маленькую программку которая ТОЛЬКО вызывает эту дллку твою. Может там еще параметры какие передавать, неважно. Отработает и убивай ексель. У меня она прикручена на ворд, из блоба файл загружается, а когда пользователь файл закрывает, то он обратно сохраняется. Модальную форму можно убить через findwindow, потом wm_close. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.06.2003, 08:42 |
|
||
|
Обнаружение и закрытие модального окна Excel
|
|||
|---|---|---|---|
|
#18+
2Cat2: А нахрена тебе кнопку нажимать именно из экселя, да еще и отдельным потоком? Создай програмульку на С++ и нажимай из нее сколько влезет! И всего-то 5-10 строчек кода: в цикле пытаешься найти твоё окно, если нашел, шлешь ему нажатие на кнопку, спишь секунду, например, и давай по новой. Все придельно тупо и без извращений. А там, если хочешь, втавь еще и выход из цикла, чтобы тебе самому было возможно эту програмку срубить, а не хочешь, так и хрен с ней, потом таск менеджером убьешь... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.06.2003, 10:32 |
|
||
|
Обнаружение и закрытие модального окна Excel
|
|||
|---|---|---|---|
|
#18+
Nickolay. Дык я тоже к этому склоняюсь. Сделаю две проги, одна пусть файлы грузит, а другая ей на кнопки нажимает. Я вот не пойму только, почему у меня через потоки не получилось. Слаб я в системных штучках-дрючка. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.06.2003, 12:16 |
|
||
|
Обнаружение и закрытие модального окна Excel
|
|||
|---|---|---|---|
|
#18+
Сделал на двух прогах. Во второй по таймеру проверятся наличие модальной формы в Excele. FindWIndow не смог заставить работать - не въехал, что там в WindowName писать надо. Заголовок окна не прокатил. Выкрутился по другому. procedure TForm1.Timer1Timer(Sender: TObject); var lpClassName, lpWindowName : Pchar; begin try EA:=GetActiveOleObject('Excel.Application'); except exit end; try HWNDExcel:=EA.Hwnd; except end; new(lpWindowName); new(lpClassName); GetClassName(HWNDExcel,lpClassName,100); HWNDForm:=GetLastActivePopup(HWNDExcel); //получаю хандлер if HWNDExcel<>HWNDForm then begin GetWindowText(HWNDForm,lpWindowName,100); if lpWindowName='UserForm1' then //если это нужная форма begin SendMessage(HWNDForm, WM_KEYDOWN, VK_RETURN, 1); //нифига не посылает. //SendMessage(HWNDForm, WM_close, 0, 0); //А вот так закрывает. Но мне этого не нужно end; end end; ======== Черт, может еще хандлер кнопки иcкать надо? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.06.2003, 00:18 |
|
||
|
Обнаружение и закрытие модального окна Excel
|
|||
|---|---|---|---|
|
#18+
Да... А ларчик просто открывался procedure TLogoAppForm.Timer1Timer(Sender: TObject); var lpClassName, lpWindowName : Pchar; begin try EA:=GetActiveOleObject('Excel.Application'); except exit end; try HWNDExcel:=EA.Hwnd; except end; new(lpWindowName); new(lpClassName); GetClassName(HWNDExcel,lpClassName,100); HWNDForm:=GetLastActivePopup(HWNDExcel); if HWNDExcel<>HWNDForm then begin GetWindowText(HWNDForm,lpWindowName,100); if lpWindowName='UserForm1' then EA.Application.SendKeys('~'); end end; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.06.2003, 14:44 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=32194483&tid=2117851]: |
0ms |
get settings: |
8ms |
get forum list: |
20ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
58ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
66ms |
get tp. blocked users: |
2ms |
| others: | 231ms |
| total: | 405ms |

| 0 / 0 |
