powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Обнаружение и закрытие модального окна Excel
16 сообщений из 16, страница 1 из 1
Обнаружение и закрытие модального окна Excel
    #32190660
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попал я в засаду.
Есть некая приблуда.
Действует так. Загружает файло собственного формата в 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.
...
Рейтинг: 0 / 0
Обнаружение и закрытие модального окна Excel
    #32190689
alex_k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может тебе сымитировать нажатия операторами кнопок? ловить типа топ окно и если оно имеет GetWindowText тот который тебе нужен(например) то посылаеш этому окну wm_close (тоже например, не уверен что не сработает кансел какойнить). Я вообще, правильно проблему понял?
...
Рейтинг: 0 / 0
Обнаружение и закрытие модального окна Excel
    #32190702
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alex_k. Правильно (вроде).
Т.е. ты предлагаешь в цикле ловить появление окна нужным с текстом и иммитировать нажатие кнопки?
...
Рейтинг: 0 / 0
Обнаружение и закрытие модального окна Excel
    #32190708
Фотография jimmers
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Посмотрите, что эта Dll экспортирует. Если там всего 1 функция с 1 параметром (имя xls файла), то вызови из VBA.
Хотя может быть, что там много функций. Одним словом, что за dll и что именно она экспортирует? Может эта dll
вообще COM компонент?

dumpbin /exports my.dll
...
Рейтинг: 0 / 0
Обнаружение и закрытие модального окна Excel
    #32190719
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Несколько функций без параметров.
Насколько я понял, это действительно COM.
========
С циклом - облом
...
EA.Run('fopen'); //тут моя прога останавливается, и до получения хандлера не доходит
HWND:=FindWindow(lpClassName,lpWindowName);
Label1.Caption:=lpClassName;
Label2.Caption:=lpWindowName;
Form1.Repaint;
...

Моя форма ждет, пока я закрою модальну форму в экселе.
...
Рейтинг: 0 / 0
Обнаружение и закрытие модального окна Excel
    #32190721
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dumpbin /exports my.dll
не проходит. Ругается, что нет mspdb60.dll.
...
Рейтинг: 0 / 0
Обнаружение и закрытие модального окна Excel
    #32190724
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Народ, как думаете, поможет запуcкать Excel и проверку на наличие формы в разных потоках? Не помню, как потоки делаются, до завтра не разберусь.
...
Рейтинг: 0 / 0
Обнаружение и закрытие модального окна Excel
    #32190728
Фотография akuz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно вызвать исключение в обработчике екселя и в дельфе отлавливать его.
...
Рейтинг: 0 / 0
Обнаружение и закрытие модального окна Excel
    #32190770
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код экселя мне недоступен - защита. Можно снять, но файлов - тысячи. Я как-нибудь в ПТ расскажу про эту хрень и уродов, которые это придумали
...
Рейтинг: 0 / 0
Обнаружение и закрытие модального окна Excel
    #32193049
alex_k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну че, как успехи?
Я как то писал прогу которая из текстового файла в программу(пенсионка какая-то 2ндфл вроде) забивает данные о сотрудника(фио документы адреса и т.д.). Она сама мышкой водила кнопками тайпала :-) ниче там несколько сотен записей так я программу быстрее написал нежели бы кто-то руками забивал :-)

в потоках я думаю можно а можно вообще отдельный процесс юзать. типа отдельную программу
...
Рейтинг: 0 / 0
Обнаружение и закрытие модального окна Excel
    #32193076
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ноль. Коллективно сделали из макросом из Accessa, типа он сам асинхронные потоки создает, но время задержки подбирается экспериментально для каждого компа. Правда, хоть оператору не надо торкаться.
==============
Но я не сдаюсь. Я это уделаю.
...
Рейтинг: 0 / 0
Обнаружение и закрытие модального окна Excel
    #32193293
Фотография viman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня есть функция которая запускает чтото и ждет его закрытия. Тебе можно прикрутить так: прога запускает маленькую программку которая ТОЛЬКО вызывает эту дллку твою. Может там еще параметры какие передавать, неважно. Отработает и убивай ексель. У меня она прикручена на ворд, из блоба файл загружается, а когда пользователь файл закрывает, то он обратно сохраняется. Модальную форму можно убить через findwindow, потом wm_close.
...
Рейтинг: 0 / 0
Обнаружение и закрытие модального окна Excel
    #32193393
Фотография Nickolay
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Cat2: А нахрена тебе кнопку нажимать именно из экселя, да еще и отдельным потоком? Создай програмульку на С++ и нажимай из нее сколько влезет! И всего-то 5-10 строчек кода: в цикле пытаешься найти твоё окно, если нашел, шлешь ему нажатие на кнопку, спишь секунду, например, и давай по новой. Все придельно тупо и без извращений. А там, если хочешь, втавь еще и выход из цикла, чтобы тебе самому было возможно эту програмку срубить, а не хочешь, так и хрен с ней, потом таск менеджером убьешь...
...
Рейтинг: 0 / 0
Обнаружение и закрытие модального окна Excel
    #32193541
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nickolay. Дык я тоже к этому склоняюсь. Сделаю две проги, одна пусть файлы грузит, а другая ей на кнопки нажимает.

Я вот не пойму только, почему у меня через потоки не получилось. Слаб я в системных штучках-дрючка.
...
Рейтинг: 0 / 0
Обнаружение и закрытие модального окна Excel
    #32194401
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сделал на двух прогах. Во второй по таймеру проверятся наличие модальной формы в 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кать надо?
...
Рейтинг: 0 / 0
Обнаружение и закрытие модального окна Excel
    #32194483
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да... А ларчик просто открывался

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;
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Обнаружение и закрытие модального окна Excel
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]