2016-10-16 4 views
0

アプリケーションにクロム埋め込みWebブラウザウィジェットがある場合、アプリケーションに何かが発生したことをアプリケーションに通知する方法はありますか?たとえば、アイテムのサイズが変更されたり、ボタンがクリックされ、クロム埋め込みウィジェットにロードされたjavascriptベースのページであるとします。どのようにしてC++またはDelphiアプリケーション(またはアプリケーション)にコードで通知し、メッセージまたはコールバックを送信しますか?私は何かが発生したことをアプリケーションに返信するために、sendMessage機能のようなものを探しています。Chromium Embeddedを使用すると、Javascriptからプログラムと通信する方法はありますか?

これを行う方法の例は、C++、.NET、またはDelphi、または任意の言語で行うことができます。コードを自分のDelphi言語に移植するだけで済みます。

言い換えれば、どのようにjavascriptからクロミウムに埋め込まれたWebブラウザを持つアプリケーションと通信するのですか?ページの読み込みが完了すると、そのページの読み込み終了イベントを介して通信することができます...しかし、JavaScriptコードはページが読み込まれた後でも実行される傾向があります。特に、ユーザーがマウスを使用してページ上のアイテムをドラッグするか、それでは、何か起きたときにいつでもC++/Delphiアプリケーションにどのように連絡して返信しますか?

FYIはhtml/javaコードへの完全なアクセスが可能です。つまり、私は自分のコードをjavascriptに追加することができます。 sendMessageBackToAppのようなものがあれば、それを追加したいと思います。

この機能を使用できない場合は、確かに便利です。アプリケーションとjavascipt/htmlとの間の通信は、アプリケーションが真に強力であるために不可欠です。

答えて

1

CEFでネイティブコードと通信する方法は2つあります。

  1. 「非同期JavaScriptのバインディング」 - このアプローチは(同じ名前の章がある)、ここで説明されています https://bitbucket.org/chromiumembedded/cef/wiki/GeneralUsage.md

  2. また、実際にあなたのC++コードを呼び出すしているJS関数オブジェクトを作成することができますレンダラープロセスで使用します。あなたはここでそれについての詳細を読むことができます: https://bitbucket.org/chromiumembedded/cef/wiki/JavaScriptIntegration.md

第二の方法は、より低レベルです。 CEFのIPCメカニズムを使用してブラウザプロセスと通信する必要があります。

2

クロムGuiClientデモに以下の追加は、D7に私の作品:

procedure TMainForm.TestJS; 
begin 
    if crm.Browser <> nil then 
    crm.Browser.MainFrame.ExecuteJavaScript(
     'alert(''JavaScript execute works!''); console.log(''From Javascript'')', 'about:blank', 0); 
end; 

procedure TMainForm.crmConsoleMessage(Sender: TObject; const browser: 
    ICefBrowser; const message, source: ustring; line: Integer; out Result: 
    Boolean); 
begin 
    ShowMessage('OnConsoleMessage: ' + Message); 
    Result := True; 
end; 

は、より完全な議論についてはこちらをご覧ください:https://groups.google.com/forum/#!topic/delphichromiumembedded/uDxAUTvXqzc

0

単語:拡張子。あなたはプログラムから(CefRegisterExtension)JSコードを登録することができます。 https://bitbucket.org/chromiumembedded/cef/wiki/JavaScriptIntegration.mdには、通常の手順が記載されています。 CEFの問題1944に注意してください(まだ解決されていません) - JSは弾丸である必要があります。または、それをロードしているレンダラーがクラッシュする可能性があります。

関連する問題