Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Сети > Программное нажатие кнопки в confirm-окне


Автор: endore 12.12.2013, 22:43
Пытаюсь наваять мини-клиент для сайта. Использую WebBrowser. Получалось всё, пока не натолкнулся на проблему программного нажатия на кнопку во всплывающем confirm-окне.
Выполняю
WebBrowser1.OleObject.Document.frames.item(1).document.all.item('targeting',0).click;
и скрипт открывает confirm-окно, доступ к которому никак не могу получить.
Можно ли как-нибудь перехватывать открытие этого окна?
Во всех этих конфирмах всегда нужно нажимать ОК, но при всплытии этого окна фокус, насколько я понял, переходит на него и пока не нажмёшь ОК, выполнение программы останавливается.
Как уже после всплытия можно выполнить дальше программу, чтобы попытаться найти например хэндл кнопки в этом конфирме? Или может можно перехватить его всплытие?
Не знаю как и какими приёмами можно победить этот конфирм. Прошу помощи.

Автор: Агрох 13.12.2013, 09:04
Не совсем уверен то ли это, что тебе нужно, но попробуй установить параметр TWebBrouser.Silent = true

Автор: endore 15.12.2013, 11:30
Цитата(Агрох @  13.12.2013,  09:04 Найти цитируемый пост)
 установить параметр TWebBrouser.Silent = true 

это игнор ошибок, на конфирм не влияет

Автор: endore 15.12.2013, 17:08
Натолкнулся на интересное замечание:
Цитата

Диалоговые окна alert (а также confirm и prompt) обладают некоторыми странными свойствами.

Они синхронны в том смысле, что выполнение скрипта, вызвавшего этот диалог, замораживается до закрытия диалога. Скрипт ожидает завершения функции alert(), прежде чем продолжить выполнение.

Однако некоторые браузеры позволяют производить обработку событий до тех пор, пока диалог виден на экране и ожидает пользовательских действий. Это означает, что пока один скрипт заморожен, ожидая конца выполнения функции alert, другая функция может быть выполнена в процессе обработки другого события.

События пользовательского интерфейса, такие как mouseup и click, не будут возникать в момент исполнения alert, поскольку диалог является модальным и перехватывает весь пользовательский ввод, однако не-пользовательские события, такие как загрузка страницы, отложенный код и обработчики результата асинхронных запросов XMLHttpRequest, могут возникнуть в это время.

Может кому-то придёт в голову как это использовать для решения вопроса...

Автор: endore 4.1.2014, 20:56
Решил так:

по таймеру поставил процедуру control 

Код

//-------------------закрытие--confirm------------------

function EnumWindowsProc(hWindow : hWnd;lParam  : LongInt) : Bool
{$IFDEF Win32}
stdcall;
{$ELSE} ;
export;
{$ENDIF}
var   lpBuffer : PChar;
WindowCaptionFound : bool;
ClassNameFound : bool;
begin
GetMem(lpBuffer, 255);
Result := True;
WindowCaptionFound := False;
ClassNameFound := False;
try
if GetWindowText(hWindow, lpBuffer, 255) > 0 then
if Pos(PFindWindowStruct(lParam).Caption, StrPas(lpBuffer)) > 0
then WindowCaptionFound := true;
if PFindWindowStruct(lParam).ClassName = '' then
ClassNameFound := True else         
if GetClassName(hWindow, lpBuffer, 255) > 0 then
if Pos(PFindWindowStruct(lParam).ClassName, StrPas(lpBuffer)) > 0 then
ClassNameFound := True;
if (WindowCaptionFound and ClassNameFound) then
begin
 PFindWindowStruct(lParam).WindowHandle := hWindow;
 Result := False;
end;
finally
 FreeMem(lpBuffer, sizeof(lpBuffer^));
end;
end;


function FindAWindow(Caption, ClassName : string) : THandle;
var   WindowInfo : TFindWindowStruct;
begin
 with WindowInfo do
begin
 Caption := 'Сообщение с веб-страницы';
 ClassName := '32770';
 WindowHandle := 0;
 EnumWindows(@EnumWindowsProc, LongInt(@WindowInfo));
 FindAWindow := WindowHandle;
end;
end;

procedure SimulateKeystroke(Key : byte; extra : DWORD);
begin
        keybd_event(Key,extra,0,0);
        keybd_event(Key,extra,KEYEVENTF_KEYUP,0);
end;

procedure TSC.control(Sender: TObject);
var   TheWindowHandle : THandle;
begin   TheWindowHandle := FindAWindow('Сообщение с веб-страницы', '32770');
 if TheWindowHandle = 0 then
 exit else
 BringWindowToTop(TheWindowHandle);
 SimulateKeystroke(VK_RETURN, 0);
end;

//-------------------END---закрытие--confirm--------




работает на ура

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)