Компонент TEdgeBrowser: вызов машинного кода из скрипта, запущенного на встроенной веб-странице

В настоящее время мы используем TWebBrowserкомпонент для встраивания IE в наше настольное приложение. Для вызова кода Delphi из скрипта, запущенного во встроенном браузере, мы реализовали поддержкуwindow.externalобъект, как описано здесь: http://www.delphidabbler.com/articles/article-22

Теперь по многим причинам нам нужно перейти на современный браузер. Мы уже обновились до Delphi 10.4, в котором представлены новыеTEdgeBrowserкомпонент (MS Edge на основе Chromium). Можно ли использоватьwindow.external также для TEdgeBrowser? Если да, то как? Или есть другой способ вызвать собственный код из скрипта во встроенном браузере?

1 ответ

Решение

Наконец, все оказалось довольно просто. Спасибо TOndrej за ссылку "Начало работы", которая помогла мне разобраться. Я также понял, что он работает с MS Edge Beta (84.0.522.28), поэтому Canary не требуется, как описано здесь Марко Канту: https://blog.marcocantu.com/blog/2020-may-edge-browser-component.html. Я надеюсь, что скоро он будет работать с официальным MS Edge. Вот несколько фрагментов кода:

Delphi:

procedure TForm1.Button1Click(Sender: TObject);
begin
  EdgeBrowser1.Navigate(ExtractFilePath(ParamStr(0))  + 'index.html');
end;

procedure TForm1.EdgeBrowser1WebMessageReceived(Sender: TCustomEdgeBrowser; Args: TWebMessageReceivedEventArgs);
var
  Msg: PChar;
begin
  Args.ArgsInterface.Get_webMessageAsJson(Msg);
  MessageBox(Handle, Msg, PChar(EmptyStr), MB_OK);
end;

HTML:

<!DOCTYPE html>
<html>
<body>
    <p onclick="handleClick()">Click me</p>
    <script>
        function handleClick() {
            window.chrome.webview.postMessage({ data: 'Message from Edge Chromium', url: window.document.URL });
        }
    </script>
</body>
</html> 

Другие вопросы по тегам