Nano Hash - криптовалюты, майнинг, программирование

HOWTO: Имитация нажатия кнопки «ОК» в окне оповещения/сообщения веб-браузера, инициированном JavaScript? (Дельфи)

У меня есть приложение с WebBrowser внутри:

когда я публикую свою веб-страницу, у меня появляется всплывающее предупреждение / окно сообщения javascript, где мне нужно нажать «ОК». Вот мой javascript, который создает предупреждение:

    function delete(){
    if (confirm('Are you sure you wish to delete this ?')){
            document.forms.item.action = "edit.asp?action=delete";
            document.forms.item.submit();
        }

    }

Я искал какое-то время, но пока не нашел рабочего решения...

Заранее спасибо за вашу помощь!


  • Используйте такой инструмент, как Wspector, чтобы определить класс или заголовок окна, в котором появляется предупреждение. Затем создайте таймер в своей форме, чтобы следить за появлением этого окна, а затем используйте SendMessage, чтобы отправить его по нажатию мыши или аналогичному. 09.08.2012

Ответы:


1

Реализуйте IDocHostShowUI::ShowMessage и покажите свой собственный диалог или просто верните S_OK.

Примечание: ссылка битая. Вот код решения:

      IDocHostShowUI = interface(IUnknown)
        ['{c4d244b0-d43e-11cf-893b-00aa00bdce1a}']
        function ShowMessage(hwnd: THandle; lpstrText: POleStr; lpstrCaption: POleStr;
          dwType: longint; lpstrHelpFile: POleStr; dwHelpContext: longint;
          var plResult: LRESULT): HRESULT; stdcall;
      end;

      TShowMessageEvent = function(Sender: TObject; HWND: THandle;
        lpstrText: POleStr; lpstrCaption: POleStr; dwType: Longint; lpstrHelpFile: POleStr;
        dwHelpContext: Longint; var plResult: LRESULT): HRESULT of object;

      TWebBrowser = class(SHDocVw.TWebBrowser, IDocHostShowUI)
        private
          fOnShowMessage: TShowMessageEvent;
        protected
          function ShowMessage(HWND: THandle; lpstrText: POleStr; lpstrCaption: POleStr;
            dwType: Longint; lpstrHelpFile: POleStr; dwHelpContext: Longint;
            var plResult: LRESULT): HRESULT; stdcall;
        published
          property OnShowMessage: TShowMessageEvent read fOnShowMessage write
            fOnShowMessage;
      end;

function TWebBrowser.ShowMessage(HWND: THandle; lpstrText, lpstrCaption: POleStr;
  dwType: Integer; lpstrHelpFile: POleStr; dwHelpContext: Integer;
  var plResult: LRESULT): HRESULT;
begin
  if Assigned(fOnShowMessage) then
    Result := fOnShowMessage(Self, HWND, lpstrText, lpStrCaption, dwType,
      lpStrHelpFile, dwHelpContext, plResult)
  else
  Result:= S_OK;
end;
10.08.2012
  • На самом деле это лучшее решение моей проблемы: `function CommandTarget_Exec(CmdGroup: PGUID; nCmdID, nCmdexecopt: DWORD; const vaIn: OleVariant; var vaOut: OleVariant): HRESULT; начать, если nCmdID = OLECMDID_SHOWMESSAGE, затем начать Результат:=S_OK; vaOut:=истина; выход; конец; конец;' 14.03.2016

  • 2

    Если это для очень ограниченного внутреннего использования, вы можете сделать грязный

    procedure TForm1.Timer1Timer(Sender: TObject);
    const
      TargetCaption = 'Meddelande från webbsida';
    var
      S: string;
      len: integer;
    begin
      SetLength(S, 127);
      len := GetWindowText(Application.ActiveFormHandle, PChar(S), 127);
      if len = 0 then Exit;
      SetLength(S, len);
      if S = TargetCaption then
        SendMessage(Application.ActiveFormHandle, WM_COMMAND, ID_OK, 0);
    end;
    

    где TargetCaption – известный заголовок TWebBrowser всплывающих окон, диалогов подтверждения или подсказок. Это может варьироваться между версиями ОС и языковыми версиями, поэтому этот подход приемлем только в очень ограниченном внутреннем приложении, где можно «обновлять» приложение с каждым новым пакетом обновления Windows...

    Кстати, «Meddelande från webbsida» по-шведски означает «Сообщение с веб-страницы».

    09.08.2012
  • Tack sa mycket! Отличный ответ, я просто тестирую ваше решение прямо сейчас. 10.08.2012
  • Работал нормально! Удачи Свенской в ​​гандбольном финале! :) Мы только что проиграли вам вчера. 11.08.2012
  • Есть ли способ поймать текст с веб-сайта и нажать «НЕТ» в диалоговом окне «Да/Нет» в IE? Тэк! 23.04.2013
  • ID_NO и ID_YES поняли :) 09.05.2013

  • 3

    Кнопки в полях alert() confirm() и prompt() не поддерживаются сценариями. Вместо этого используйте модальное диалоговое окно HTML/CSS.

    09.08.2012
  • Спасибо за Ваш ответ. Можете ли вы быть более конкретным, пожалуйста? 10.08.2012
  • -1 На самом деле, вы можете переопределить поля предупреждений() и подтверждения() с помощью IDocHostShowUI::ShowMessage 28.12.2013
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..